Beginn: 15.11.2022, 08:15

Ende: 25.11.2022, 23:59

 

Abgabe: Pro Zweiergruppe ein .Rmd und .html File via e-mail an

 

Vorname, Name:

 

Vorname, Name:

 

Erreichte Punktzahl:

 

Note:

 

Hiermit erklären wir, dass die vorliegende Arbeit selbständig und ohne Hilfe weiterer Personen erarbeitet und geschrieben wurde und auch nicht an andere Personen weitergereicht wurde und wird.


Einführung

Beurteilungskriterien

Beurteilt werden Umfang, Inhalt und Form der Abgabe jeder Gruppe; die pro Aufgabe erworbenen Punktezahl bestimmt sich aus Vollständigkeit, Korrektheit der Analyse sowie Qualität der Codierung.

Die maximale Anzahl möglicher Punkte ist hinter jeder Aufgabe vermerkt.

Sprache: Empfohlen ist in den Codes, Grafiken und Tabellen konsistent Englisch zu verwenden, damit die Namen der Attribute nicht übersetzt werden müssen.

Visualisierung: Bitte achtet darauf, dass alle Grafiken übersichtlich und vollständig beschriftet und koloriert sind und die Art der verwendeten Grafik entsprechend dem Datentyp sinnvoll gewählt ist.

Dokumentation: Kommentiert eure Codes, wo spezielle Überlegung einfliessen und beschreibt die Resulate der Analysen in wenigen Sätzen präzise.

Datenbeschreibung

Ihr erhaltet Daten von 40’060 Hotelbuchungen und den Auftrag diese zu analysieren. Pro Buchung stehen die folgenden 31 Attribute zur Verfügung (zusammengehörende Attribute werden gemeinsam beschrieben).

  1. IsCanceled: Information, ob die Buchung storniert wurde,
  2. LeadTime: Anzahl Tage zwischen Buchung und Eintreffen im Hotel,
  3. ArrivalDateYear, -Month, -DateWeekNumber, DateDayOfMonth: Information zum Zeitpunkt des Eintreffens im Hotel,
  4. StaysInWeekendNights, StaysInWeekNights: Anzahl gebuchter Nächte am Wochenende, bzw. an Werktagen,
  5. Adults, Children, Babies: Anzahl Erwachsene, Kinder und Babies pro Buchung,
  6. Meal: Art des gebuchten Verpflegungen, d.h. BB (Bed & Breakfast), HB (Half board oder Halbpension), FB (Full board oder Vollpension), Undefined (kein Paket),
  7. Country: Herkunftsland des Gastes,
  8. MarketSegment: Marktsegment der Buchung, wie z.B. Geschäftskunde, Direktkunde, Gruppe (TA = Tour Agents, TO = Tour Operators),
  9. DistributionChannel: Vertriebskanal der Buchung (TA = Tour Agents, TO = Tour Operators),
  10. IsRepeatedGuest: Information, ob die Buchung einem früheren Gast zugewiesen werden kann,
  11. PreviousCancellations: Information zur Anzahl früherer Stornierungen des Gastes,
  12. PreviousBookingsNotCanceled: Information zur Anzahl früherer Buchung des Gastes ohne Stornierung,
  13. ReservedRoomType / AssignedRoomType: reservierter Zimmertyp, bzw. tatsächlich bezogener Zimmertyp,
  14. BookingChanges: Anzahl Anpassungen der Buchung bis zum Check-In bzw. bis zur Stornierung,
  15. DepositType: Art der bei Buchung hinterlegten Sicherheit. Non-Refundable bedeutet der Gesamtbetrag wurde bezahlt und kann nicht zurückgefordert werden, Refundable bedeutet ein Teilbetrag wurde bezahlt und kann zurückgefordert werden,
  16. Agent / Company: Agentur bzw. Firma, welche die Buchung durchgeführt hat,
  17. DaysInWaitingList: Anzahl Tage bis der Gast die Bestätigung für die Buchung erhalten hat,
  18. CustomerType: Kundenart des Gastes,
  19. ADR: Average Daily Rate in EURO, d.h. durchschnittlich bezahlter Preis pro Übernachtung
  20. RequiredCarParkingSpaces: Anzahl für den Gast benötigter Parkplätze,
  21. TotalOfSpecialRequests: Anzahl spezieller Anfragen des Gastes (z.B. Kinderbett, Doppelbett),
  22. ReservationStatus: letzter Status der Buchung (Check-Out, No-Show, Canceled),
  23. ReservationStatusDate: letzter Statusänderung der Buchung.

Analysen vorbereiten

Aufgabe (1 Punkt): Lade die Analyse-Pakete

Lade die für die Analysen relevanten Pakete.

Hinweis: Verwende für deine Implementierung tidyverse, für Zeitreihenanalyse lubridate und zusätzlich ggmosaic und knitr.

library(tidyverse)
Registered S3 methods overwritten by 'dbplyr':
  method         from
  print.tbl_lazy     
  print.tbl_sql      
── Attaching packages ────────────────────────────────────────────────────────────── tidyverse 1.3.2 ──✔ ggplot2 3.3.6      ✔ purrr   0.3.4 
✔ tibble  3.1.8      ✔ dplyr   1.0.10
✔ tidyr   1.2.1      ✔ stringr 1.4.1 
✔ readr   2.1.2      ✔ forcats 0.5.2 ── Conflicts ───────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
library(lubridate)

Attache Paket: ‘lubridate’

Die folgenden Objekte sind maskiert von ‘package:base’:

    date, intersect, setdiff, union
library(ggmosaic)
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
Registered S3 method overwritten by 'htmlwidgets':
  method           from         
  print.htmlwidget tools:rstudio
library(knitr)
library(dplyr)
library(ggplot2)

Daten laden und inspizieren

Aufgabe (1 Punkt): Lade die Daten

Lade die zu analysierenden Daten.

Hinweis: Verwende für deine Implementierung die Funktion read.csv() und das File “H1.csv”.

<<<<<<< HEAD
pathDenis <- "C:/Users/denis/OneDrive/Dokumente/FHNW/1.Sem/eda/Hotelchallenge/Daten/HS22_EDA_MC/H1.csv"
pathFlavio <- "/Users/flavio/Library/CloudStorage/OneDrive-FHNW/EDA/HS22_EDA_MC/H1.csv"
dataFrame <- read.csv(pathDenis)

dataFrame
=======
pathDenis <- "C:/Users/denis/OneDrive/Dokumente/FHNW/1.Sem/eda/Hotelchallenge/Daten/HS22_EDA_MC/H1.csv"
pathFlavio <- "/Users/flavio/Library/CloudStorage/OneDrive-FHNW/EDA/HS22_EDA_MC/H1.csv"
dataFrame <- read.csv("/Users/flavio/Library/CloudStorage/OneDrive-FHNW/EDA/HS22_EDA_MC/H1.csv")

dataFrame
>>>>>>> 2eb627b3b503ce1522c2ee6032b390992962e732

Aufgabe (1 Punkt): Untersuche die Grösse des Data Frames

Gib für die eingelesenen Daten die Anzahl Beobachtungen und Attribute aus.

<<<<<<< HEAD
count(dataFrame) #Anzahl
=======
count(dataFrame) #Anzahl
>>>>>>> 2eb627b3b503ce1522c2ee6032b390992962e732
<<<<<<< HEAD
attributes(dataFrame) #Attribute
$names
 [1] "IsCanceled"                  "LeadTime"                    "ArrivalDateYear"            
 [4] "ArrivalDateMonth"            "ArrivalDateWeekNumber"       "ArrivalDateDayOfMonth"      
 [7] "StaysInWeekendNights"        "StaysInWeekNights"           "Adults"                     
[10] "Children"                    "Babies"                      "Meal"                       
[13] "Country"                     "MarketSegment"               "DistributionChannel"        
[16] "IsRepeatedGuest"             "PreviousCancellations"       "PreviousBookingsNotCanceled"
[19] "ReservedRoomType"            "AssignedRoomType"            "BookingChanges"             
[22] "DepositType"                 "Agent"                       "Company"                    
[25] "DaysInWaitingList"           "CustomerType"                "ADR"                        
[28] "RequiredCarParkingSpaces"    "TotalOfSpecialRequests"      "ReservationStatus"          
[31] "ReservationStatusDate"      
=======
attributes(dataFrame) #Attribute
$names
 [1] "IsCanceled"                  "LeadTime"                    "ArrivalDateYear"             "ArrivalDateMonth"           
 [5] "ArrivalDateWeekNumber"       "ArrivalDateDayOfMonth"       "StaysInWeekendNights"        "StaysInWeekNights"          
 [9] "Adults"                      "Children"                    "Babies"                      "Meal"                       
[13] "Country"                     "MarketSegment"               "DistributionChannel"         "IsRepeatedGuest"            
[17] "PreviousCancellations"       "PreviousBookingsNotCanceled" "ReservedRoomType"            "AssignedRoomType"           
[21] "BookingChanges"              "DepositType"                 "Agent"                       "Company"                    
[25] "DaysInWaitingList"           "CustomerType"                "ADR"                         "RequiredCarParkingSpaces"   
[29] "TotalOfSpecialRequests"      "ReservationStatus"           "ReservationStatusDate"      
>>>>>>> 2eb627b3b503ce1522c2ee6032b390992962e732

$class
[1] "data.frame"

$row.names
<<<<<<< HEAD
   [1]    1    2    3    4    5    6    7    8    9   10   11   12   13   14   15   16   17   18   19
  [20]   20   21   22   23   24   25   26   27   28   29   30   31   32   33   34   35   36   37   38
  [39]   39   40   41   42   43   44   45   46   47   48   49   50   51   52   53   54   55   56   57
  [58]   58   59   60   61   62   63   64   65   66   67   68   69   70   71   72   73   74   75   76
  [77]   77   78   79   80   81   82   83   84   85   86   87   88   89   90   91   92   93   94   95
  [96]   96   97   98   99  100  101  102  103  104  105  106  107  108  109  110  111  112  113  114
 [115]  115  116  117  118  119  120  121  122  123  124  125  126  127  128  129  130  131  132  133
 [134]  134  135  136  137  138  139  140  141  142  143  144  145  146  147  148  149  150  151  152
 [153]  153  154  155  156  157  158  159  160  161  162  163  164  165  166  167  168  169  170  171
 [172]  172  173  174  175  176  177  178  179  180  181  182  183  184  185  186  187  188  189  190
 [191]  191  192  193  194  195  196  197  198  199  200  201  202  203  204  205  206  207  208  209
 [210]  210  211  212  213  214  215  216  217  218  219  220  221  222  223  224  225  226  227  228
 [229]  229  230  231  232  233  234  235  236  237  238  239  240  241  242  243  244  245  246  247
 [248]  248  249  250  251  252  253  254  255  256  257  258  259  260  261  262  263  264  265  266
 [267]  267  268  269  270  271  272  273  274  275  276  277  278  279  280  281  282  283  284  285
 [286]  286  287  288  289  290  291  292  293  294  295  296  297  298  299  300  301  302  303  304
 [305]  305  306  307  308  309  310  311  312  313  314  315  316  317  318  319  320  321  322  323
 [324]  324  325  326  327  328  329  330  331  332  333  334  335  336  337  338  339  340  341  342
 [343]  343  344  345  346  347  348  349  350  351  352  353  354  355  356  357  358  359  360  361
 [362]  362  363  364  365  366  367  368  369  370  371  372  373  374  375  376  377  378  379  380
 [381]  381  382  383  384  385  386  387  388  389  390  391  392  393  394  395  396  397  398  399
 [400]  400  401  402  403  404  405  406  407  408  409  410  411  412  413  414  415  416  417  418
 [419]  419  420  421  422  423  424  425  426  427  428  429  430  431  432  433  434  435  436  437
 [438]  438  439  440  441  442  443  444  445  446  447  448  449  450  451  452  453  454  455  456
 [457]  457  458  459  460  461  462  463  464  465  466  467  468  469  470  471  472  473  474  475
 [476]  476  477  478  479  480  481  482  483  484  485  486  487  488  489  490  491  492  493  494
 [495]  495  496  497  498  499  500  501  502  503  504  505  506  507  508  509  510  511  512  513
 [514]  514  515  516  517  518  519  520  521  522  523  524  525  526  527  528  529  530  531  532
 [533]  533  534  535  536  537  538  539  540  541  542  543  544  545  546  547  548  549  550  551
 [552]  552  553  554  555  556  557  558  559  560  561  562  563  564  565  566  567  568  569  570
 [571]  571  572  573  574  575  576  577  578  579  580  581  582  583  584  585  586  587  588  589
 [590]  590  591  592  593  594  595  596  597  598  599  600  601  602  603  604  605  606  607  608
 [609]  609  610  611  612  613  614  615  616  617  618  619  620  621  622  623  624  625  626  627
 [628]  628  629  630  631  632  633  634  635  636  637  638  639  640  641  642  643  644  645  646
 [647]  647  648  649  650  651  652  653  654  655  656  657  658  659  660  661  662  663  664  665
 [666]  666  667  668  669  670  671  672  673  674  675  676  677  678  679  680  681  682  683  684
 [685]  685  686  687  688  689  690  691  692  693  694  695  696  697  698  699  700  701  702  703
 [704]  704  705  706  707  708  709  710  711  712  713  714  715  716  717  718  719  720  721  722
 [723]  723  724  725  726  727  728  729  730  731  732  733  734  735  736  737  738  739  740  741
 [742]  742  743  744  745  746  747  748  749  750  751  752  753  754  755  756  757  758  759  760
 [761]  761  762  763  764  765  766  767  768  769  770  771  772  773  774  775  776  777  778  779
 [780]  780  781  782  783  784  785  786  787  788  789  790  791  792  793  794  795  796  797  798
 [799]  799  800  801  802  803  804  805  806  807  808  809  810  811  812  813  814  815  816  817
 [818]  818  819  820  821  822  823  824  825  826  827  828  829  830  831  832  833  834  835  836
 [837]  837  838  839  840  841  842  843  844  845  846  847  848  849  850  851  852  853  854  855
 [856]  856  857  858  859  860  861  862  863  864  865  866  867  868  869  870  871  872  873  874
 [875]  875  876  877  878  879  880  881  882  883  884  885  886  887  888  889  890  891  892  893
 [894]  894  895  896  897  898  899  900  901  902  903  904  905  906  907  908  909  910  911  912
 [913]  913  914  915  916  917  918  919  920  921  922  923  924  925  926  927  928  929  930  931
 [932]  932  933  934  935  936  937  938  939  940  941  942  943  944  945  946  947  948  949  950
 [951]  951  952  953  954  955  956  957  958  959  960  961  962  963  964  965  966  967  968  969
 [970]  970  971  972  973  974  975  976  977  978  979  980  981  982  983  984  985  986  987  988
=======
   [1]    1    2    3    4    5    6    7    8    9   10   11   12   13   14   15   16   17   18   19   20   21   22   23   24   25   26
  [27]   27   28   29   30   31   32   33   34   35   36   37   38   39   40   41   42   43   44   45   46   47   48   49   50   51   52
  [53]   53   54   55   56   57   58   59   60   61   62   63   64   65   66   67   68   69   70   71   72   73   74   75   76   77   78
  [79]   79   80   81   82   83   84   85   86   87   88   89   90   91   92   93   94   95   96   97   98   99  100  101  102  103  104
 [105]  105  106  107  108  109  110  111  112  113  114  115  116  117  118  119  120  121  122  123  124  125  126  127  128  129  130
 [131]  131  132  133  134  135  136  137  138  139  140  141  142  143  144  145  146  147  148  149  150  151  152  153  154  155  156
 [157]  157  158  159  160  161  162  163  164  165  166  167  168  169  170  171  172  173  174  175  176  177  178  179  180  181  182
 [183]  183  184  185  186  187  188  189  190  191  192  193  194  195  196  197  198  199  200  201  202  203  204  205  206  207  208
 [209]  209  210  211  212  213  214  215  216  217  218  219  220  221  222  223  224  225  226  227  228  229  230  231  232  233  234
 [235]  235  236  237  238  239  240  241  242  243  244  245  246  247  248  249  250  251  252  253  254  255  256  257  258  259  260
 [261]  261  262  263  264  265  266  267  268  269  270  271  272  273  274  275  276  277  278  279  280  281  282  283  284  285  286
 [287]  287  288  289  290  291  292  293  294  295  296  297  298  299  300  301  302  303  304  305  306  307  308  309  310  311  312
 [313]  313  314  315  316  317  318  319  320  321  322  323  324  325  326  327  328  329  330  331  332  333  334  335  336  337  338
 [339]  339  340  341  342  343  344  345  346  347  348  349  350  351  352  353  354  355  356  357  358  359  360  361  362  363  364
 [365]  365  366  367  368  369  370  371  372  373  374  375  376  377  378  379  380  381  382  383  384  385  386  387  388  389  390
 [391]  391  392  393  394  395  396  397  398  399  400  401  402  403  404  405  406  407  408  409  410  411  412  413  414  415  416
 [417]  417  418  419  420  421  422  423  424  425  426  427  428  429  430  431  432  433  434  435  436  437  438  439  440  441  442
 [443]  443  444  445  446  447  448  449  450  451  452  453  454  455  456  457  458  459  460  461  462  463  464  465  466  467  468
 [469]  469  470  471  472  473  474  475  476  477  478  479  480  481  482  483  484  485  486  487  488  489  490  491  492  493  494
 [495]  495  496  497  498  499  500  501  502  503  504  505  506  507  508  509  510  511  512  513  514  515  516  517  518  519  520
 [521]  521  522  523  524  525  526  527  528  529  530  531  532  533  534  535  536  537  538  539  540  541  542  543  544  545  546
 [547]  547  548  549  550  551  552  553  554  555  556  557  558  559  560  561  562  563  564  565  566  567  568  569  570  571  572
 [573]  573  574  575  576  577  578  579  580  581  582  583  584  585  586  587  588  589  590  591  592  593  594  595  596  597  598
 [599]  599  600  601  602  603  604  605  606  607  608  609  610  611  612  613  614  615  616  617  618  619  620  621  622  623  624
 [625]  625  626  627  628  629  630  631  632  633  634  635  636  637  638  639  640  641  642  643  644  645  646  647  648  649  650
 [651]  651  652  653  654  655  656  657  658  659  660  661  662  663  664  665  666  667  668  669  670  671  672  673  674  675  676
 [677]  677  678  679  680  681  682  683  684  685  686  687  688  689  690  691  692  693  694  695  696  697  698  699  700  701  702
 [703]  703  704  705  706  707  708  709  710  711  712  713  714  715  716  717  718  719  720  721  722  723  724  725  726  727  728
 [729]  729  730  731  732  733  734  735  736  737  738  739  740  741  742  743  744  745  746  747  748  749  750  751  752  753  754
 [755]  755  756  757  758  759  760  761  762  763  764  765  766  767  768  769  770  771  772  773  774  775  776  777  778  779  780
 [781]  781  782  783  784  785  786  787  788  789  790  791  792  793  794  795  796  797  798  799  800  801  802  803  804  805  806
 [807]  807  808  809  810  811  812  813  814  815  816  817  818  819  820  821  822  823  824  825  826  827  828  829  830  831  832
 [833]  833  834  835  836  837  838  839  840  841  842  843  844  845  846  847  848  849  850  851  852  853  854  855  856  857  858
 [859]  859  860  861  862  863  864  865  866  867  868  869  870  871  872  873  874  875  876  877  878  879  880  881  882  883  884
 [885]  885  886  887  888  889  890  891  892  893  894  895  896  897  898  899  900  901  902  903  904  905  906  907  908  909  910
 [911]  911  912  913  914  915  916  917  918  919  920  921  922  923  924  925  926  927  928  929  930  931  932  933  934  935  936
 [937]  937  938  939  940  941  942  943  944  945  946  947  948  949  950  951  952  953  954  955  956  957  958  959  960  961  962
 [963]  963  964  965  966  967  968  969  970  971  972  973  974  975  976  977  978  979  980  981  982  983  984  985  986  987  988
>>>>>>> 2eb627b3b503ce1522c2ee6032b390992962e732
 [989]  989  990  991  992  993  994  995  996  997  998  999 1000
 [ reached getOption("max.print") -- omitted 39060 entries ]

Aufgabe (1 Punkt): Inspiziere die Dateninhalte

Gib eine Zufallsstichprobe von 5 Beobachtungen aus (verwende als Seed die Zahl 4711) und verschafffe dir einen Überblick über die Daten.

<<<<<<< HEAD
set.seed(4711)
sampleRows <- sample(1:nrow(dataFrame), 5)
slice(dataFrame, sampleRows)
=======
set.seed(4711)
sampleRows <- sample(1:nrow(dataFrame), 5)
slice(dataFrame, sampleRows)
>>>>>>> 2eb627b3b503ce1522c2ee6032b390992962e732

Aufgabe (1 Punkt): Untersuche Struktur und Datentypen

Gib die Struktur des Data Frames aus und verschaffe dir einen Überblick über die Datentypen.

<<<<<<< HEAD
glimpse(dataFrame)
Rows: 40,060
Columns: 31
$ IsCanceled                  <int> 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
$ LeadTime                    <int> 342, 737, 7, 13, 14, 14, 0, 9, 85, 75, 23, 35, 68, 18, 37, 68, 37…
$ ArrivalDateYear             <int> 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015,…
$ ArrivalDateMonth            <chr> "July", "July", "July", "July", "July", "July", "July", "July", "…
$ ArrivalDateWeekNumber       <int> 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 2…
$ ArrivalDateDayOfMonth       <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…
$ StaysInWeekendNights        <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2,…
$ StaysInWeekNights           <int> 0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 4, 4, 4, 4, 4, 4, 4, 1, 1, 4, 4, 4,…
$ Adults                      <int> 2, 2, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2,…
$ Children                    <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,…
$ Babies                      <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
$ Meal                        <chr> "BB       ", "BB       ", "BB       ", "BB       ", "BB       ", …
$ Country                     <chr> "PRT", "PRT", "GBR", "GBR", "GBR", "GBR", "PRT", "PRT", "PRT", "P…
$ MarketSegment               <chr> "Direct", "Direct", "Direct", "Corporate", "Online TA", "Online T…
$ DistributionChannel         <chr> "Direct", "Direct", "Direct", "Corporate", "TA/TO", "TA/TO", "Dir…
$ IsRepeatedGuest             <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
$ PreviousCancellations       <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
$ PreviousBookingsNotCanceled <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
$ ReservedRoomType            <chr> "C               ", "C               ", "A               ", "A   …
$ AssignedRoomType            <chr> "C               ", "C               ", "C               ", "A   …
$ BookingChanges              <int> 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1,…
$ DepositType                 <chr> "No Deposit     ", "No Deposit     ", "No Deposit     ", "No Depo…
$ Agent                       <chr> "       NULL", "       NULL", "       NULL", "        304", "    …
$ Company                     <chr> "       NULL", "       NULL", "       NULL", "       NULL", "    …
$ DaysInWaitingList           <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
$ CustomerType                <chr> "Transient", "Transient", "Transient", "Transient", "Transient", …
$ ADR                         <dbl> 0.00, 0.00, 75.00, 75.00, 98.00, 98.00, 107.00, 103.00, 82.00, 10…
$ RequiredCarParkingSpaces    <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
$ TotalOfSpecialRequests      <int> 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 3, 1, 0, 3, 0, 0, 0, 1, 1, 1,…
$ ReservationStatus           <chr> "Check-Out", "Check-Out", "Check-Out", "Check-Out", "Check-Out", …
$ ReservationStatusDate       <chr> "2015-07-01", "2015-07-01", "2015-07-02", "2015-07-02", "2015-07-…
=======
glimpse(dataFrame)
Rows: 40,060
Columns: 31
$ IsCanceled                  <int> 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1,…
$ LeadTime                    <int> 342, 737, 7, 13, 14, 14, 0, 9, 85, 75, 23, 35, 68, 18, 37, 68, 37, 12, 0, 7, 37, 72, 72, 72, 127, …
$ ArrivalDateYear             <int> 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 20…
$ ArrivalDateMonth            <chr> "July", "July", "July", "July", "July", "July", "July", "July", "July", "July", "July", "July", "J…
$ ArrivalDateWeekNumber       <int> 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27…
$ ArrivalDateDayOfMonth       <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…
$ StaysInWeekendNights        <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 4, 2,…
$ StaysInWeekNights           <int> 0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 4, 4, 4, 4, 4, 4, 4, 1, 1, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 10, 11, …
$ Adults                      <int> 2, 2, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2,…
$ Children                    <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
$ Babies                      <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
$ Meal                        <chr> "BB       ", "BB       ", "BB       ", "BB       ", "BB       ", "BB       ", "BB       ", "FB    …
$ Country                     <chr> "PRT", "PRT", "GBR", "GBR", "GBR", "GBR", "PRT", "PRT", "PRT", "PRT", "PRT", "PRT", "USA", "ESP", …
$ MarketSegment               <chr> "Direct", "Direct", "Direct", "Corporate", "Online TA", "Online TA", "Direct", "Direct", "Online T…
$ DistributionChannel         <chr> "Direct", "Direct", "Direct", "Corporate", "TA/TO", "TA/TO", "Direct", "Direct", "TA/TO", "TA/TO",…
$ IsRepeatedGuest             <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
$ PreviousCancellations       <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
$ PreviousBookingsNotCanceled <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
$ ReservedRoomType            <chr> "C               ", "C               ", "A               ", "A               ", "A               "…
$ AssignedRoomType            <chr> "C               ", "C               ", "C               ", "A               ", "A               "…
$ BookingChanges              <int> 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 2, 0, 0,…
$ DepositType                 <chr> "No Deposit     ", "No Deposit     ", "No Deposit     ", "No Deposit     ", "No Deposit     ", "No…
$ Agent                       <chr> "       NULL", "       NULL", "       NULL", "        304", "        240", "        240", "       …
$ Company                     <chr> "       NULL", "       NULL", "       NULL", "       NULL", "       NULL", "       NULL", "       …
$ DaysInWaitingList           <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
$ CustomerType                <chr> "Transient", "Transient", "Transient", "Transient", "Transient", "Transient", "Transient", "Transi…
$ ADR                         <dbl> 0.00, 0.00, 75.00, 75.00, 98.00, 98.00, 107.00, 103.00, 82.00, 105.50, 123.00, 145.00, 97.00, 154.…
$ RequiredCarParkingSpaces    <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0,…
$ TotalOfSpecialRequests      <int> 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 3, 1, 0, 3, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 2, 0, 1, 2, 0, 2,…
$ ReservationStatus           <chr> "Check-Out", "Check-Out", "Check-Out", "Check-Out", "Check-Out", "Check-Out", "Check-Out", "Check-…
$ ReservationStatusDate       <chr> "2015-07-01", "2015-07-01", "2015-07-02", "2015-07-02", "2015-07-03", "2015-07-03", "2015-07-03", …
>>>>>>> 2eb627b3b503ce1522c2ee6032b390992962e732

Aufgabe (2 Punkte): Identifiziere Duplikate

Bestimme wieviele doppelte Beobachtungen im Data Frame auftauchen.

Hinweis: Aufgrund fehlender Hintergrundinformationen werden für die nächsten Schritte zunächst keine Beobachtungen entfernt, auch wenn im Datensatz viel redundante Informationen vorhanden sind!

<<<<<<< HEAD
duplicateList <- dataFrame[duplicated(dataFrame), ]
newList <- duplicateList %>% group_by_all() %>% summarise(n = n())
=======
duplicateList <- dataFrame[duplicated(dataFrame), ]
newList <- duplicateList %>% group_by_all() %>% summarise(n = n())
>>>>>>> 2eb627b3b503ce1522c2ee6032b390992962e732
`summarise()` has grouped output by 'IsCanceled', 'LeadTime', 'ArrivalDateYear', 'ArrivalDateMonth', 'ArrivalDateWeekNumber', 'ArrivalDateDayOfMonth', 'StaysInWeekendNights', 'StaysInWeekNights', 'Adults', 'Children', 'Babies', 'Meal', 'Country', 'MarketSegment', 'DistributionChannel', 'IsRepeatedGuest', 'PreviousCancellations', 'PreviousBookingsNotCanceled', 'ReservedRoomType', 'AssignedRoomType', 'BookingChanges', 'DepositType', 'Agent', 'Company', 'DaysInWaitingList', 'CustomerType', 'ADR', 'RequiredCarParkingSpaces', 'TotalOfSpecialRequests', 'ReservationStatus'. You can override using the `.groups` argument.
<<<<<<< HEAD
print(sum(newList$n))
=======
print(sum(newList$n))
>>>>>>> 2eb627b3b503ce1522c2ee6032b390992962e732
[1] 6092

Aufgabe (10 Punkte): Identifiziere Gruppen doppelter Beobachtungen

Doppelte Beobachtungen treten im vorliegenden Datensatz in unterschiedlicher Gruppierung auf: es gibt Beobachtungen, die nur zweimal, aber auch Beobachtungen, die mehr als ein Dutzend mal vorhanden sind. Gib für die vier Gruppierungen mit den meisten doppelten Beobachtungen je eine vollständige Beobachtung aus.

Hinweis: Aufgrund fehlender Hintergrundinformationen werden für die nächsten Schritte zunächst keine Beobachtungen entfernt, auch wenn im Datensatz viel redundante Informationen vorhanden sind!

<<<<<<< HEAD
biggestDuplicates <- newList[order(newList$n, decreasing = TRUE),]

biggestDuplicates <- biggestDuplicates[1:4,]
=======
biggestDuplicates <- newList[order(newList$n, decreasing = TRUE),]

biggestDuplicates <- biggestDuplicates[1:4,]
>>>>>>> 2eb627b3b503ce1522c2ee6032b390992962e732

Daten transformieren

Aufgabe (2 Punkte): Benenne Attribute um

Die folgenden Attribute sind neu zu benennen (alterName -> neuerName)

  • TotalOfSpecialRequests -> TotalSpecialRequests
  • ADR -> AverageDailyRate
  • IsCanceled -> BookingCancelled
<<<<<<< HEAD
#names(dataFrame)

dataFrame <- dataFrame %>% rename(
  BookingCancelled = IsCanceled, 
  AverageDailyRate = ADR,
  TotalSpecialRequests = TotalOfSpecialRequests
  )
=======
#names(dataFrame)

dataFrame <- dataFrame %>% rename(
  BookingCancelled = IsCanceled, 
  AverageDailyRate = ADR,
  TotalSpecialRequests = TotalOfSpecialRequests
  )
>>>>>>> 2eb627b3b503ce1522c2ee6032b390992962e732

Aufgabe (2 Punkte): Entferne Leerzeichen

Entferne gleichzeitig für alle character-wertigen Attribute, die Leerzeichen, welche vor oder nach dem Text auftauchen.

Hinweis: Verwende für deine Implementierung die Funktion across() und den Post Umgang mit textuellen Daten mit tidyverse’s stringr.

<<<<<<< HEAD
library(stringr)
dataFrame <- dataFrame %>%
  mutate(across(where(is.character), str_trim))

#glimpse(dataFrame)
  
=======
library(stringr)
dataFrame <- dataFrame %>%
  mutate(across(where(is.character), str_trim))

#glimpse(dataFrame)
  
>>>>>>> 2eb627b3b503ce1522c2ee6032b390992962e732

Aufgabe (2 Punkte): Untersuche fehlende Informationen

Untersuche allfällige fehlende Informationen (NAs) im Data Frame und zähle wieviele NAs vorkommen.

<<<<<<< HEAD
#Aufpassen bei bestimmten Funktionen werden fehlende Informationen automatisch als N/A kategorisiert
#Keine NAs vorhanden, gibt es fehlende Informationen?
sapply(dataFrame, function(x) sum(is.na(x)))
           BookingCancelled                    LeadTime             ArrivalDateYear 
                          0                           0                           0 
           ArrivalDateMonth       ArrivalDateWeekNumber       ArrivalDateDayOfMonth 
                          0                           0                           0 
       StaysInWeekendNights           StaysInWeekNights                      Adults 
                          0                           0                           0 
                   Children                      Babies                        Meal 
                          0                           0                           0 
                    Country               MarketSegment         DistributionChannel 
                          0                           0                           0 
            IsRepeatedGuest       PreviousCancellations PreviousBookingsNotCanceled 
                          0                           0                           0 
           ReservedRoomType            AssignedRoomType              BookingChanges 
                          0                           0                           0 
                DepositType                       Agent                     Company 
                          0                           0                           0 
          DaysInWaitingList                CustomerType            AverageDailyRate 
                          0                           0                           0 
   RequiredCarParkingSpaces        TotalSpecialRequests           ReservationStatus 
                          0                           0                           0 
      ReservationStatusDate 
                          0 
=======
#Aufpassen bei bestimmten Funktionen werden fehlende Informationen automatisch als N/A kategorisiert
#Keine NAs vorhanden, gibt es fehlende Informationen?
sapply(dataFrame, function(x) sum(is.na(x)))
           BookingCancelled                    LeadTime             ArrivalDateYear            ArrivalDateMonth 
                          0                           0                           0                           0 
      ArrivalDateWeekNumber       ArrivalDateDayOfMonth        StaysInWeekendNights           StaysInWeekNights 
                          0                           0                           0                           0 
                     Adults                    Children                      Babies                        Meal 
                          0                           0                           0                           0 
                    Country               MarketSegment         DistributionChannel             IsRepeatedGuest 
                          0                           0                           0                           0 
      PreviousCancellations PreviousBookingsNotCanceled            ReservedRoomType            AssignedRoomType 
                          0                           0                           0                           0 
             BookingChanges                 DepositType                       Agent                     Company 
                          0                           0                           0                           0 
          DaysInWaitingList                CustomerType            AverageDailyRate    RequiredCarParkingSpaces 
                          0                           0                           0                           0 
       TotalSpecialRequests           ReservationStatus       ReservationStatusDate 
                          0                           0                           0 
>>>>>>> 2eb627b3b503ce1522c2ee6032b390992962e732

Aufgabe (3 Punkte): Ersetze “NULL” Werte

Ersetze gleichzeitig alle Werte “NULL” für die Attribute “Company” und “Agent” durch NA und und zähle wieviele NAs in jedem der beiden Attributen vorkommen.

<<<<<<< HEAD
#!!!Funktioniert aber ändert nur die Namen nicht den tatsächlichen Wert, muss noch überarbeitet werden, denke ich!!
#Ändert den Wert im Dataframe aber nicht in der Konsole.
NAs <- c("Company", "Agent")
dataFrame %>%
  mutate_at(vars(NAs), ~ str_replace(., "NULL", "NA"))
Note: Using an external vector in selections is ambiguous.
ℹ Use `all_of(NAs)` instead of `NAs` to silence this message.
ℹ See <https://tidyselect.r-lib.org/reference/faq-external-vector.html>.
This message is displayed once per session.
=======
#!!!Funktioniert aber ändert nur die Namen nicht den tatsächlichen Wert, muss noch überarbeitet werden, denke ich!!
NAs <- c("Company", "Agent")
dataFrame %>%
  mutate_at(vars(NAs), ~ str_replace(., "NULL", "NA"))
Warnung: Using an external vector in selections was deprecated in tidyselect 1.1.0.
Please use `all_of()` or `any_of()` instead.
# Was:
data %>% select(NAs)

# Now:
data %>% select(all_of(NAs))

See <https://tidyselect.r-lib.org/reference/faq-external-vector.html>.
>>>>>>> 2eb627b3b503ce1522c2ee6032b390992962e732

Aufgabe (4 Punkte): Ersetze Abkürzungen

Ersetze gleichzeitig für die Attribute “MarketSegment” und “DistributionChannel” die Abkürzungen

  • “TA” durch “Tour Agent”,
  • “TO” durch “Tour Operator”.

Hinweis: Verwende für deine Implementierung die Funktion gsub() oder Ähnliches.

<<<<<<< HEAD
#Habe ich geschafft aber leider nicht mit der gsub Funktion, gerne Denis probieren
=======
#Habe ich geschafft aber leider nicht mit der gsub Funktion, gerne Denis probieren
>>>>>>> 2eb627b3b503ce1522c2ee6032b390992962e732

Aufgabe (4 Punkte): Ersetze weitere Abkürzungen

Ersetze für das Attribut “Meal” die verwendeten Abkürzungen

  • “BB” durch “Bed & Breakfast”,
  • “HB” durch “Half board”,
  • “FB” durch “Full board”,
  • “Undefined” durch “kein Paket”.

Ersetze weiter für die Attribute “BookingCancelled” und “IsRepeatedGuest” die Werte 1 durch “Yes” und 0 durch “No”.

<<<<<<< HEAD
dataFrame$Meal <- gsub("BB", "Bed & Breakfast",
                  gsub("HB", "Half board",
                  gsub("FB", "Full board",
                  gsub("Undefined", "kein Paket", dataFrame$Meal))))




#Code fuktioniert allerdings werden 2 seperate Dataframes generiert und nicht beide in der gleichen. Denis fragen?
dataFrame %>% mutate(BookingCancelled=recode(BookingCancelled, "1"="Yes", "0"="No"))
=======
dataFrame$Meal <- gsub("BB", "Bed & Breakfast",
                  gsub("HB", "Half board",
                  gsub("FB", "Full board",
                  gsub("Undefined", "kein Paket", dataFrame$Meal))))

dataFrame <- dataFrame %>% mutate(BookingCancelled=recode(BookingCancelled, "1"="Yes", "0"="No"))
dataFrame <- dataFrame %>% mutate(IsRepeatedGuest=recode(IsRepeatedGuest, "1"="Yes", "0"="No"))
>>>>>>> 2eb627b3b503ce1522c2ee6032b390992962e732
dataFrame %>% mutate(IsRepeatedGuest=recode(IsRepeatedGuest, "1"="Yes", "0"="No"))

Aufgabe (6 Punkte): Erstelle Datumsvariablen

Erstelle Datumsvariablen für Reservation und Ankunft aufgrund der Informationen “ReservationStatusDate” bzw. “ArrivalDateYear”, “ArrivalDateYear”, “ArrivalDateDayOfMonth”.

Hinweis: Verwende für deine Implementierung die library lubridate und Informationen aus R for Data Science, Chapter “Dates and times” sowie die Posts Umgang mit Datumsinformationen und Umgang mit textuellen Daten mit tidyverse’s stringr.

<<<<<<< HEAD
library(lubridate)

#Das wäre ein Vorschlag, ich weiss aber nicht ob dies so oder in einem anderen Format gefordert wird.
#dataFrameDates <- dataFrame
#dataFrameDates <- cbind(dataFrameDates, ArrivalDate = mdy(str_c(str_c(dataFrameDates$ArrivalDateMonth, dataFrameDates$ArrivalDateDayOfMonth, sep = " "), #dataFrameDates$ArrivalDateYear, sep = ", ")))
#dataFrameDates <- dataFrameDates[order(dataFrameDates$ArrivalDate), ]
=======
library(lubridate)

#Das wäre ein Vorschlag, ich weiss aber nicht ob dies so oder in einem anderen Format gefordert wird.
#dataFrameDates <- dataFrame
#dataFrameDates <- cbind(dataFrameDates, ArrivalDate = mdy(str_c(str_c(dataFrameDates$ArrivalDateMonth, dataFrameDates$ArrivalDateDayOfMonth, sep = " "), #dataFrameDates$ArrivalDateYear, sep = ", ")))
#dataFrameDates <- dataFrameDates[order(dataFrameDates$ArrivalDate), ]
>>>>>>> 2eb627b3b503ce1522c2ee6032b390992962e732

Aufgabe (3 Punkte): Bilde Faktoren

Konvertiere sämtliche kategorialen Variablen und mache daraus Faktoren und überprüfe die Datentypen der konvertierten Variablen für die Variablen “BookingCancelled” und “DepositType”.

Hinweis: Verwende für deine Implementierung across() und eine bestehende R Basis-Funktion zur Prüfung der erfolgreichen Bildung der Faktoren.

<<<<<<< HEAD
#kategoriale Variablen: Meal,Country, Marketsegment, Distributionschannel, ReservedRoomType, AssignedRoomType, DepositType, Agent, Company, Customertype, Average Daily Rate.
#Diese gilt es als factor Variablen darzustellen, habe ich leider nich geschafft. Denis probieren.
#Gibts es noch mehr kategoriale Variablen? 



#Überprüfen mit R Basis Funktion
class(dataFrame$BookingCancelled)
[1] "integer"
class(dataFrame$DepositType)
=======
#kategoriale Variablen: Meal,Country, Marketsegment, Distributionschannel, ReservedRoomType, AssignedRoomType, DepositType, Agent, Company, Customertype, Average Daily Rate.
#Diese gilt es als factor Variablen darzustellen, habe ich leider nich geschafft. Denis probieren.
#Gibts es noch mehr kategoriale Variablen? 



#Überprüfen mit R Basis Funktion
class(dataFrame$BookingCancelled)
[1] "character"
class(dataFrame$DepositType)
>>>>>>> 2eb627b3b503ce1522c2ee6032b390992962e732
[1] "character"

Aufgabe (7 Punkte): Erstelle neue Variablen

Erstelle neue Variablen, welche Auskunft geben über

  • die Anzahl Logiernächte pro Buchung -> neue Variable “TotalNights” als Summe der Anzahl Nächte an Wochentagen (“StaysInWeekNights) und Wochenendtagen (”StaysInWeekendNights”),
  • die Anzahl Personen pro Buchung -> neue Variable “GroupSize” als Summe von “Adults”, “Children” und “Babies”,
  • den bezahlten Preis pro Aufenthalt -> neue Variable “Price” gebildet als Produkt von “AverageDailyRate” und “TotalNights”.

Erstelle daraus abgeleitet weitere Attribute für die Art des Aufenthalts (neue Faktor-Variable “StayType”):

  • “Long stay” definiert als Aufenthalt von mehr als 7 Nächten,
  • “Full week” definiert als Aufenthalt von 7 Nächten,
  • “Week stay” definiert als Aufenthalt von weniger als 7 Tagen ohne Wochenendübernachtungen,
  • “Weekend only” definiert als eintägiger Aufenthalt mit einer Wochenendübernachtung,
  • “Long weekend” definiert als zweitägiger Aufenthalt mit zwei Wochenendübernachtungen,

sowie den Haushaltstyp (neue Faktor-Variable “HouseholdType”):

  • “Single” definiert als Buchung für genau eine Erwachsene,
  • “Couple” definiert als Buchung für genau zwei Erwachsene,
  • “Single Parent” definiert als Buchung für eine Erwachsene und ein oder mehrere Kinder oder Babies,
  • “Family” definiert als Buchung für zwei Erwachsene und ein oder mehrere Kinder oder Babies,
  • “Group” definiert als Buchung für mehr als zwei Erwachsene (mit oder ohne Kinder / Babies),
<<<<<<< HEAD
#TotalNights Variable erstellen
dataFrame$TotalNights <- dataFrame$StaysInWeekNights + dataFrame$StaysInWeekendNights
#GroupSize Variable erstellen
dataFrame$GroupSize <- dataFrame$Adults + dataFrame$Children + dataFrame$Babies
#Price Variable erstellen
dataFrame$Price <- dataFrame$AverageDailyRate * dataFrame$TotalNights

#StayType Variable erstellen
dataFrame %>%
  mutate(StayType = case_when(TotalNights > 7 ~ "Long Stay",
                              TotalNights == 7 ~ "Full week",
                              StaysInWeekNights < 7 & StaysInWeekendNights == 0 ~ "Week Stay",
                              TotalNights == 1 & StaysInWeekendNights == 1 ~ "Weekend only",
                              StaysInWeekNights == 0 & StaysInWeekendNights == 2 ~ "Long Weekend"))
<<<<<<< HEAD

#HouseholdType Variable erstellen     adults, children, babies
dataFrame %>%
  mutate(HouseholdType = case_when(Adults == 1 & Children == 0 & Babies == 0 ~ "Single",
                                   Adults == 2 & Children == 0 & Babies == 0 ~ "Couple",
                                   Adults == 1 & Children >= 0 & Babies >= 0 ~ "Single Parent",
                                   Adults == 2 & Children >= 0 & Babies >= 0 ~ "Family",
                                   Adults >  2 & Children >= 0 & Babies >= 0 ~ "Group"))

Summarische Statistiken erzeugen

Aufgabe (3 Punkte): Erstelle Häufigkeitstabellen

Gib für die beiden oben bearbeiteten Attribute “MarketSegment” und “DistributionChannel” je eine separate Häufigkeitstabelle aus.

Hinweis: Verwende für deine Implementierung nur einen Aufruf der Funktion summary().

<<<<<<< HEAD
cleanedList <- dataFrame
#Marketsegment
freqTableMarketSegment <- cleanedList %>% group_by(Marketsegment = cleanedList$MarketSegment) %>% summarise(Count = n())
freqTableMarketSegment <- freqTableMarketSegment[order(freqTableMarketSegment$Count, decreasing = TRUE),]
totalSegments <- sum(freqTableMarketSegment$Count)
freqTableMarketSegment <- cbind(freqTableMarketSegment, Percentage = freqTableMarketSegment$Count/totalSegments * 100)

#DistributionChannel
freqTableDistributionChannel <- cleanedList %>% group_by(DistributionChannel = cleanedList$DistributionChannel) %>% summarise(Count = n())
freqTableDistributionChannel <- freqTableDistributionChannel[order(freqTableDistributionChannel$Count, decreasing = TRUE),]
totalSegments <- sum(freqTableDistributionChannel$Count)
freqTableDistributionChannel <- cbind(freqTableDistributionChannel, Percentage = freqTableDistributionChannel$Count/totalSegments * 100)
=======
cleanedList <- dataFrame
#Marketsegment
freqTableMarketSegment <- cleanedList %>% group_by(Marketsegment = cleanedList$MarketSegment) %>% summarise(Count = n())
freqTableMarketSegment <- freqTableMarketSegment[order(freqTableMarketSegment$Count, decreasing = TRUE),]
totalSegments <- sum(freqTableMarketSegment$Count)
freqTableMarketSegment <- cbind(freqTableMarketSegment, Percentage = freqTableMarketSegment$Count/totalSegments * 100)

#DistributionChannel
freqTableDistributionChannel <- cleanedList %>% group_by(DistributionChannel = cleanedList$DistributionChannel) %>% summarise(Count = n())
freqTableDistributionChannel <- freqTableDistributionChannel[order(freqTableDistributionChannel$Count, decreasing = TRUE),]
totalSegments <- sum(freqTableDistributionChannel$Count)
freqTableDistributionChannel <- cbind(freqTableDistributionChannel, Percentage = freqTableDistributionChannel$Count/totalSegments * 100)
>>>>>>> 2eb627b3b503ce1522c2ee6032b390992962e732

Aufgabe (3 Punkte): Erstelle weitere Häufigkeitstabellen

Gib für die Attribute “Meal” und “IsRepeatedGuest” separat tabellarische Häufigkeitsverteilungen aus.

Hinweis: Verwende für deine Implementierung die Funktion kable().

<<<<<<< HEAD
#Meals
freqTableMeal <- cleanedList %>% group_by(Meal = cleanedList$Meal) %>% summarise(Count = n())
freqTableMeal <- freqTableMeal[order(freqTableMeal$Count, decreasing = TRUE),]
totalSegments <- sum(freqTableMeal$Count)
freqTableMeal <- cbind(freqTableMeal, Percentage = freqTableMeal$Count/totalSegments * 100)
kable(freqTableMeal, digits = 2, format = "pipe")
=======
#Meals
freqTableMeal <- cleanedList %>% group_by(Meal = cleanedList$Meal) %>% summarise(Count = n())
freqTableMeal <- freqTableMeal[order(freqTableMeal$Count, decreasing = TRUE),]
totalSegments <- sum(freqTableMeal$Count)
freqTableMeal <- cbind(freqTableMeal, Percentage = freqTableMeal$Count/totalSegments * 100)
kable(freqTableMeal, digits = 2, format = "pipe")
>>>>>>> 2eb627b3b503ce1522c2ee6032b390992962e732
Meal Count Percentage
Bed & Breakfast 30005 74.90
Half board 8046 20.08
kein Paket 1169 2.92
Full board 754 1.88
SC 86 0.21
<<<<<<< HEAD

#IsRepeatedGuest
freqTableIsRepeatedGuest <- cleanedList %>% group_by(Meal = cleanedList$IsRepeatedGuest) %>% summarise(Count = n())
freqTableIsRepeatedGuest <- freqTableIsRepeatedGuest[order(freqTableIsRepeatedGuest$Count, decreasing = TRUE),]
totalSegments <- sum(freqTableIsRepeatedGuest$Count)
freqTableIsRepeatedGuest <- cbind(freqTableIsRepeatedGuest, Percentage = freqTableIsRepeatedGuest$Count/totalSegments * 100)
kable(freqTableIsRepeatedGuest, digits = 2, format = "pipe")
=======

#IsRepeatedGuest
freqTableIsRepeatedGuest <- cleanedList %>% group_by(Meal = cleanedList$IsRepeatedGuest) %>% summarise(Count = n())
freqTableIsRepeatedGuest <- freqTableIsRepeatedGuest[order(freqTableIsRepeatedGuest$Count, decreasing = TRUE),]
totalSegments <- sum(freqTableIsRepeatedGuest$Count)
freqTableIsRepeatedGuest <- cbind(freqTableIsRepeatedGuest, Percentage = freqTableIsRepeatedGuest$Count/totalSegments * 100)
kable(freqTableIsRepeatedGuest, digits = 2, format = "pipe")
>>>>>>> 2eb627b3b503ce1522c2ee6032b390992962e732 <<<<<<< HEAD ======= >>>>>>> 2eb627b3b503ce1522c2ee6032b390992962e732 <<<<<<< HEAD ======= >>>>>>> 2eb627b3b503ce1522c2ee6032b390992962e732 <<<<<<< HEAD ======= >>>>>>> 2eb627b3b503ce1522c2ee6032b390992962e732
MealMealCount Percentage
0No38282 95.56
1Yes1778 4.44
<<<<<<< HEAD
NA
=======
NA
>>>>>>> 2eb627b3b503ce1522c2ee6032b390992962e732

Aufgabe (5 Punkte): Erstelle weitere Häufigkeitstabellen

Erstelle eine summarische, univariate Statistik für alle Attribute und dokumentiere kurz allfällige Besonderheiten.

<<<<<<< HEAD
#BookingCancelled
freqTableBookingCancelled <- cleanedList %>% group_by(BookingCancelled = cleanedList$BookingCancelled) %>% summarise(Count = n())
freqTableBookingCancelled <- freqTableBookingCancelled[order(freqTableBookingCancelled$Count, decreasing = TRUE),]
totalSegments <- sum(freqTableBookingCancelled$Count)
freqTableBookingCancelled <- cbind(freqTableBookingCancelled, Percentage = freqTableBookingCancelled$Count/totalSegments * 100)
kable(freqTableBookingCancelled, digits = 2, format = "pipe")
=======
#BookingCancelled
freqTableBookingCancelled <- cleanedList %>% group_by(BookingCancelled = cleanedList$BookingCancelled) %>% summarise(Count = n())
freqTableBookingCancelled <- freqTableBookingCancelled[order(freqTableBookingCancelled$Count, decreasing = TRUE),]
totalSegments <- sum(freqTableBookingCancelled$Count)
freqTableBookingCancelled <- cbind(freqTableBookingCancelled, Percentage = freqTableBookingCancelled$Count/totalSegments * 100)
kable(freqTableBookingCancelled, digits = 2, format = "pipe")
>>>>>>> 2eb627b3b503ce1522c2ee6032b390992962e732 <<<<<<< HEAD ======= >>>>>>> 2eb627b3b503ce1522c2ee6032b390992962e732 <<<<<<< HEAD ======= >>>>>>> 2eb627b3b503ce1522c2ee6032b390992962e732 <<<<<<< HEAD ======= >>>>>>> 2eb627b3b503ce1522c2ee6032b390992962e732
BookingCancelledBookingCancelledCount Percentage
0No28938 72.24
1Yes11122 27.76
<<<<<<< HEAD
#LeadTime
freqTableLeadTime <- cleanedList %>% group_by(LeadTime = cleanedList$LeadTime) %>% summarise(Count = n())
freqTableLeadTime <- freqTableLeadTime[order(freqTableLeadTime$Count, decreasing = TRUE),]
totalSegments <- sum(freqTableLeadTime$Count)
freqTableLeadTime <- cbind(freqTableLeadTime, Percentage = freqTableLeadTime$Count/totalSegments * 100)
kable(freqTableLeadTime, digits = 2, format = "pipe")
=======
#LeadTime
freqTableLeadTime <- cleanedList %>% group_by(LeadTime = cleanedList$LeadTime) %>% summarise(Count = n())
freqTableLeadTime <- freqTableLeadTime[order(freqTableLeadTime$Count, decreasing = TRUE),]
totalSegments <- sum(freqTableLeadTime$Count)
freqTableLeadTime <- cbind(freqTableLeadTime, Percentage = freqTableLeadTime$Count/totalSegments * 100)
kable(freqTableLeadTime, digits = 2, format = "pipe")
>>>>>>> 2eb627b3b503ce1522c2ee6032b390992962e732
LeadTime Count Percentage
0 3236 8.08
1 1595 3.98
2 939 2.34
3 794 1.98
4 663 1.66
5 600 1.50
7 573 1.43
6 538 1.34
10 391 0.98
8 388 0.97
11 385 0.96
9 368 0.92
12 343 0.86
17 317 0.79
40 310 0.77
14 305 0.76
13 282 0.70
16 278 0.69
24 274 0.68
15 272 0.68
22 264 0.66
31 261 0.65
18 257 0.64
19 255 0.64
26 251 0.63
21 240 0.60
23 234 0.58
29 233 0.58
36 231 0.58
30 223 0.56
32 223 0.56
20 219 0.55
27 214 0.53
25 213 0.53
33 211 0.53
47 203 0.51
28 200 0.50
37 196 0.49
45 189 0.47
112 186 0.46
35 185 0.46
39 183 0.46
72 182 0.45
44 179 0.45
34 177 0.44
41 168 0.42
49 168 0.42
152 168 0.42
38 159 0.40
43 158 0.39
74 157 0.39
131 157 0.39
66 155 0.39
78 154 0.38
82 154 0.38
46 152 0.38
48 152 0.38
42 148 0.37
80 147 0.37
50 143 0.36
92 142 0.35
169 141 0.35
57 140 0.35
73 140 0.35
53 139 0.35
60 139 0.35
103 136 0.34
51 135 0.34
65 134 0.33
81 134 0.33
61 132 0.33
128 132 0.33
62 131 0.33
168 131 0.33
183 131 0.33
52 130 0.32
59 130 0.32
70 130 0.32
55 129 0.32
83 129 0.32
94 128 0.32
124 128 0.32
165 128 0.32
113 127 0.32
87 126 0.31
211 126 0.31
67 123 0.31
143 123 0.31
172 122 0.30
203 122 0.30
56 120 0.30
69 120 0.30
77 117 0.29
259 117 0.29
54 116 0.29
86 116 0.29
96 116 0.29
155 116 0.29
64 114 0.28
185 114 0.28
171 113 0.28
100 112 0.28
244 112 0.28
236 111 0.28
287 109 0.27
93 108 0.27
115 108 0.27
58 107 0.27
136 107 0.27
63 106 0.26
76 105 0.26
85 105 0.26
88 105 0.26
116 105 0.26
162 105 0.26
105 104 0.26
140 103 0.26
68 102 0.25
108 102 0.25
159 102 0.25
101 99 0.25
123 99 0.25
71 97 0.24
89 97 0.24
98 97 0.24
84 96 0.24
106 96 0.24
181 96 0.24
90 95 0.24
95 95 0.24
199 95 0.24
222 95 0.24
79 94 0.23
107 94 0.23
151 94 0.23
166 94 0.23
157 92 0.23
214 92 0.23
117 91 0.23
126 91 0.23
148 90 0.22
191 90 0.22
225 89 0.22
177 88 0.22
197 88 0.22
121 87 0.22
102 86 0.21
149 86 0.21
178 86 0.21
110 84 0.21
154 84 0.21
167 84 0.21
207 84 0.21
138 83 0.21
97 82 0.20
119 82 0.20
238 82 0.20
91 81 0.20
111 81 0.20
129 81 0.20
146 81 0.20
364 81 0.20
114 80 0.20
156 80 0.20
130 79 0.20
160 79 0.20
223 79 0.20
75 78 0.19
125 78 0.19
153 78 0.19
212 78 0.19
213 78 0.19
99 77 0.19
132 77 0.19
164 77 0.19
139 76 0.19
277 76 0.19
104 75 0.19
118 75 0.19
144 75 0.19
336 75 0.19
109 74 0.18
122 73 0.18
210 73 0.18
239 73 0.18
174 72 0.18
221 72 0.18
245 72 0.18
383 72 0.18
142 71 0.18
170 71 0.18
247 71 0.18
187 70 0.17
219 70 0.17
135 69 0.17
145 69 0.17
386 69 0.17
173 68 0.17
180 68 0.17
158 67 0.17
161 67 0.17
201 67 0.17
253 67 0.17
163 65 0.16
120 64 0.16
179 64 0.16
189 64 0.16
195 64 0.16
292 64 0.16
150 63 0.16
133 62 0.15
141 62 0.15
127 61 0.15
134 60 0.15
196 60 0.15
200 60 0.15
192 59 0.15
208 59 0.15
188 58 0.14
198 58 0.14
231 58 0.14
251 58 0.14
275 58 0.14
237 56 0.14
147 55 0.14
194 55 0.14
205 55 0.14
220 54 0.13
226 54 0.13
241 54 0.13
272 54 0.13
137 53 0.13
186 53 0.13
202 53 0.13
182 52 0.13
184 52 0.13
289 52 0.13
339 52 0.13
175 51 0.13
206 51 0.13
227 51 0.13
215 49 0.12
190 48 0.12
193 47 0.12
204 47 0.12
224 47 0.12
252 47 0.12
468 47 0.12
216 45 0.11
232 45 0.11
342 45 0.11
217 44 0.11
312 44 0.11
176 43 0.11
234 42 0.10
209 41 0.10
248 41 0.10
250 41 0.10
254 41 0.10
257 41 0.10
246 40 0.10
261 40 0.10
243 39 0.10
262 39 0.10
258 38 0.09
274 37 0.09
230 36 0.09
265 36 0.09
283 36 0.09
218 35 0.09
240 35 0.09
279 35 0.09
304 35 0.09
322 35 0.09
267 34 0.08
285 34 0.08
302 34 0.08
255 32 0.08
305 32 0.08
228 29 0.07
266 29 0.07
288 29 0.07
319 29 0.07
323 29 0.07
327 29 0.07
385 29 0.07
235 28 0.07
286 28 0.07
393 28 0.07
233 27 0.07
270 26 0.06
320 26 0.06
337 26 0.06
229 25 0.06
351 25 0.06
242 24 0.06
256 24 0.06
260 24 0.06
333 24 0.06
411 24 0.06
273 23 0.06
276 23 0.06
280 23 0.06
297 23 0.06
313 23 0.06
328 23 0.06
542 23 0.06
294 22 0.05
310 22 0.05
264 21 0.05
309 21 0.05
249 20 0.05
269 20 0.05
301 20 0.05
318 20 0.05
335 20 0.05
343 20 0.05
350 20 0.05
388 20 0.05
462 20 0.05
263 19 0.05
268 19 0.05
311 19 0.05
315 19 0.05
378 19 0.05
282 18 0.04
314 18 0.04
326 18 0.04
338 18 0.04
291 17 0.04
295 17 0.04
300 17 0.04
307 17 0.04
317 17 0.04
397 17 0.04
284 16 0.04
321 16 0.04
296 15 0.04
306 15 0.04
330 15 0.04
271 14 0.03
303 14 0.03
334 14 0.03
352 14 0.03
278 13 0.03
290 13 0.03
293 13 0.03
332 13 0.03
324 12 0.03
340 12 0.03
347 11 0.03
353 11 0.03
365 11 0.03
281 10 0.02
308 10 0.02
345 10 0.02
298 9 0.02
325 9 0.02
329 9 0.02
299 8 0.02
344 8 0.02
348 8 0.02
349 8 0.02
358 8 0.02
363 8 0.02
316 7 0.02
331 7 0.02
346 7 0.02
354 7 0.02
360 7 0.02
341 6 0.01
355 6 0.01
406 6 0.01
471 6 0.01
359 5 0.01
361 5 0.01
368 5 0.01
379 5 0.01
390 4 0.01
356 3 0.01
357 3 0.01
367 3 0.01
376 3 0.01
445 3 0.01
460 3 0.01
362 2 0.00
366 2 0.00
373 2 0.00
375 2 0.00
381 2 0.00
382 2 0.00
384 2 0.00
389 2 0.00
394 2 0.00
399 2 0.00
403 2 0.00
407 2 0.00
422 2 0.00
370 1 0.00
371 1 0.00
372 1 0.00
374 1 0.00
398 1 0.00
400 1 0.00
424 1 0.00
434 1 0.00
435 1 0.00
450 1 0.00
454 1 0.00
532 1 0.00
709 1 0.00
737 1 0.00

Erkenntniss: Erstaundlich viele kurzfristige Buchungen.

<<<<<<< HEAD
#Country
freqTableCountry <- cleanedList %>% group_by(Country = cleanedList$Country) %>% summarise(Count = n())
freqTableCountry <- freqTableCountry[order(freqTableCountry$Count, decreasing = TRUE),]
totalSegments <- sum(freqTableCountry$Count)
freqTableCountry <- cbind(freqTableCountry, Percentage = freqTableCountry$Count/totalSegments * 100)
kable(freqTableCountry, digits = 2, format = "pipe")
=======
#Country
freqTableCountry <- cleanedList %>% group_by(Country = cleanedList$Country) %>% summarise(Count = n())
freqTableCountry <- freqTableCountry[order(freqTableCountry$Count, decreasing = TRUE),]
totalSegments <- sum(freqTableCountry$Count)
freqTableCountry <- cbind(freqTableCountry, Percentage = freqTableCountry$Count/totalSegments * 100)
kable(freqTableCountry, digits = 2, format = "pipe")
>>>>>>> 2eb627b3b503ce1522c2ee6032b390992962e732
Country Count Percentage
PRT 17630 44.01
GBR 6814 17.01
ESP 3957 9.88
IRL 2166 5.41
FRA 1611 4.02
DEU 1203 3.00
CN 710 1.77
NLD 514 1.28
USA 479 1.20
NULL 464 1.16
ITA 459 1.15
BEL 448 1.12
CHE 435 1.09
BRA 430 1.07
POL 333 0.83
SWE 304 0.76
AUT 210 0.52
RUS 189 0.47
ROU 177 0.44
FIN 151 0.38
CHN 134 0.33
NOR 123 0.31
AUS 87 0.22
LUX 80 0.20
MAR 75 0.19
DNK 65 0.16
ARG 57 0.14
HUN 47 0.12
LTU 46 0.11
IND 37 0.09
EST 33 0.08
LVA 33 0.08
ISR 28 0.07
CZE 27 0.07
AGO 24 0.06
TUR 23 0.06
UKR 23 0.06
ZAF 18 0.04
CHL 17 0.04
COL 16 0.04
PHL 16 0.04
NZL 14 0.03
GIB 13 0.03
DZA 12 0.03
SVK 12 0.03
TWN 12 0.03
ARE 11 0.03
GEO 11 0.03
HRV 11 0.03
OMN 11 0.03
SVN 11 0.03
GRC 10 0.02
MYS 10 0.02
NGA 10 0.02
JPN 9 0.02
KOR 9 0.02
PRI 9 0.02
CYP 8 0.02
URY 8 0.02
BLR 7 0.02
SRB 7 0.02
ISL 6 0.01
LBN 6 0.01
MDV 6 0.01
MEX 6 0.01
MOZ 6 0.01
THA 6 0.01
AND 5 0.01
BGR 5 0.01
CPV 5 0.01
IDN 5 0.01
IRN 5 0.01
JAM 5 0.01
KAZ 5 0.01
CUB 4 0.01
HKG 4 0.01
PAK 4 0.01
SGP 4 0.01
SUR 4 0.01
ALB 3 0.01
AZE 3 0.01
CAF 3 0.01
DOM 3 0.01
JEY 3 0.01
KWT 3 0.01
VEN 3 0.01
ARM 2 0.00
CIV 2 0.00
CMR 2 0.00
CRI 2 0.00
ECU 2 0.00
JOR 2 0.00
MLT 2 0.00
MWI 2 0.00
VNM 2 0.00
ZWE 2 0.00
BDI 1 0.00
BHR 1 0.00
BHS 1 0.00
BIH 1 0.00
BWA 1 0.00
COM 1 0.00
CYM 1 0.00
DJI 1 0.00
EGY 1 0.00
FJI 1 0.00
GGY 1 0.00
LKA 1 0.00
MAC 1 0.00
MDG 1 0.00
MKD 1 0.00
MUS 1 0.00
NPL 1 0.00
PER 1 0.00
PLW 1 0.00
QAT 1 0.00
SAU 1 0.00
SEN 1 0.00
SMR 1 0.00
SYC 1 0.00
SYR 1 0.00
TGO 1 0.00
TUN 1 0.00
UGA 1 0.00
UZB 1 0.00
ZMB 1 0.00

Erkenntniss: Viele Besucher von Portugal.

<<<<<<< HEAD
#BookingChanges
freqTableBookingChanges <- cleanedList %>% group_by(BookingChanges = cleanedList$BookingChanges) %>% summarise(Count = n())
freqTableBookingChanges <- freqTableBookingChanges[order(freqTableBookingChanges$Count, decreasing = TRUE),]
totalSegments <- sum(freqTableBookingChanges$Count)
freqTableBookingChanges <- cbind(freqTableBookingChanges, Percentage = freqTableBookingChanges$Count/totalSegments * 100)
kable(freqTableBookingChanges, digits = 2, format = "pipe")
=======
#BookingChanges
freqTableBookingChanges <- cleanedList %>% group_by(BookingChanges = cleanedList$BookingChanges) %>% summarise(Count = n())
freqTableBookingChanges <- freqTableBookingChanges[order(freqTableBookingChanges$Count, decreasing = TRUE),]
totalSegments <- sum(freqTableBookingChanges$Count)
freqTableBookingChanges <- cbind(freqTableBookingChanges, Percentage = freqTableBookingChanges$Count/totalSegments * 100)
kable(freqTableBookingChanges, digits = 2, format = "pipe")
>>>>>>> 2eb627b3b503ce1522c2ee6032b390992962e732
BookingChanges Count Percentage
0 32252 80.51
1 5469 13.65
2 1561 3.90
3 460 1.15
4 182 0.45
5 72 0.18
6 32 0.08
7 12 0.03
8 8 0.02
9 4 0.01
10 3 0.01
13 2 0.00
12 1 0.00
16 1 0.00
17 1 0.00

Erkenntniss: Keine auserordentliche Erkenntniss

<<<<<<< HEAD
#DepositType
freqTableDepositType <- cleanedList %>% group_by(DepositType = cleanedList$DepositType) %>% summarise(Count = n())
freqTableDepositType <- freqTableDepositType[order(freqTableDepositType$Count, decreasing = TRUE),]
totalSegments <- sum(freqTableDepositType$Count)
freqTableDepositType <- cbind(freqTableDepositType, Percentage = freqTableDepositType$Count/totalSegments * 100)
kable(freqTableDepositType, digits = 2, format = "pipe")
=======
#DepositType
freqTableDepositType <- cleanedList %>% group_by(DepositType = cleanedList$DepositType) %>% summarise(Count = n())
freqTableDepositType <- freqTableDepositType[order(freqTableDepositType$Count, decreasing = TRUE),]
totalSegments <- sum(freqTableDepositType$Count)
freqTableDepositType <- cbind(freqTableDepositType, Percentage = freqTableDepositType$Count/totalSegments * 100)
kable(freqTableDepositType, digits = 2, format = "pipe")
>>>>>>> 2eb627b3b503ce1522c2ee6032b390992962e732
DepositType Count Percentage
No Deposit 38199 95.35
Non Refund 1719 4.29
Refundable 142 0.35

Erkenntniss: Hauptsächlich kein Depot hinterlegt.

<<<<<<< HEAD
#CustomerType
freqTableCustomerType <- cleanedList %>% group_by(CustomerType = cleanedList$CustomerType) %>% summarise(Count = n())
freqTableCustomerType <- freqTableCustomerType[order(freqTableCustomerType$Count, decreasing = TRUE),]
totalSegments <- sum(freqTableCustomerType$Count)
freqTableCustomerType <- cbind(freqTableCustomerType, Percentage = freqTableCustomerType$Count/totalSegments * 100)
kable(freqTableCustomerType, digits = 2, format = "pipe")
=======
#CustomerType
freqTableCustomerType <- cleanedList %>% group_by(CustomerType = cleanedList$CustomerType) %>% summarise(Count = n())
freqTableCustomerType <- freqTableCustomerType[order(freqTableCustomerType$Count, decreasing = TRUE),]
totalSegments <- sum(freqTableCustomerType$Count)
freqTableCustomerType <- cbind(freqTableCustomerType, Percentage = freqTableCustomerType$Count/totalSegments * 100)
kable(freqTableCustomerType, digits = 2, format = "pipe")
>>>>>>> 2eb627b3b503ce1522c2ee6032b390992962e732
CustomerType Count Percentage
Transient 30209 75.41
Transient-Party 7791 19.45
Contract 1776 4.43
Group 284 0.71

Erkenntniss: Keine speziellen Erkenntnisse.

<<<<<<< HEAD
#RequiredCarParkingSpaces
freqTableRequiredCarParkingSpaces <- cleanedList %>% group_by(RequiredCarParkingSpaces = cleanedList$RequiredCarParkingSpaces) %>% summarise(Count = n())
freqTableRequiredCarParkingSpaces <- freqTableRequiredCarParkingSpaces[order(freqTableRequiredCarParkingSpaces$Count, decreasing = TRUE),]
totalSegments <- sum(freqTableRequiredCarParkingSpaces$Count)
freqTableRequiredCarParkingSpaces <- cbind(freqTableRequiredCarParkingSpaces, Percentage = freqTableRequiredCarParkingSpaces$Count/totalSegments * 100)
kable(freqTableRequiredCarParkingSpaces, digits = 2, format = "pipe")
=======
#RequiredCarParkingSpaces
freqTableRequiredCarParkingSpaces <- cleanedList %>% group_by(RequiredCarParkingSpaces = cleanedList$RequiredCarParkingSpaces) %>% summarise(Count = n())
freqTableRequiredCarParkingSpaces <- freqTableRequiredCarParkingSpaces[order(freqTableRequiredCarParkingSpaces$Count, decreasing = TRUE),]
totalSegments <- sum(freqTableRequiredCarParkingSpaces$Count)
freqTableRequiredCarParkingSpaces <- cbind(freqTableRequiredCarParkingSpaces, Percentage = freqTableRequiredCarParkingSpaces$Count/totalSegments * 100)
kable(freqTableRequiredCarParkingSpaces, digits = 2, format = "pipe")
>>>>>>> 2eb627b3b503ce1522c2ee6032b390992962e732
RequiredCarParkingSpaces Count Percentage
0 34570 86.30
1 5462 13.63
2 25 0.06
8 2 0.00
3 1 0.00

Erkenntniss: Die Mehrheit kommt ohne Auto.

<<<<<<< HEAD
#ReservationStatus
freqTableReservationStatus <- cleanedList %>% group_by(ReservationStatus = cleanedList$ReservationStatus) %>% summarise(Count = n())
freqTableReservationStatus <- freqTableReservationStatus[order(freqTableReservationStatus$Count, decreasing = TRUE),]
totalSegments <- sum(freqTableReservationStatus$Count)
freqTableReservationStatus <- cbind(freqTableReservationStatus, Percentage = freqTableReservationStatus$Count/totalSegments * 100)
kable(freqTableReservationStatus, digits = 2, format = "pipe")
=======
#ReservationStatus
freqTableReservationStatus <- cleanedList %>% group_by(ReservationStatus = cleanedList$ReservationStatus) %>% summarise(Count = n())
freqTableReservationStatus <- freqTableReservationStatus[order(freqTableReservationStatus$Count, decreasing = TRUE),]
totalSegments <- sum(freqTableReservationStatus$Count)
freqTableReservationStatus <- cbind(freqTableReservationStatus, Percentage = freqTableReservationStatus$Count/totalSegments * 100)
kable(freqTableReservationStatus, digits = 2, format = "pipe")
>>>>>>> 2eb627b3b503ce1522c2ee6032b390992962e732
ReservationStatus Count Percentage
Check-Out 28938 72.24
Canceled 10831 27.04
No-Show 291 0.73

Erkenntniss: Keine speziellen Erkenntnisse.

<<<<<<< HEAD
#Company
freqTableCompany <- cleanedList %>% group_by(Company = cleanedList$Company) %>% summarise(Count = n())
freqTableCompany <- freqTableCompany[order(freqTableCompany$Count, decreasing = TRUE),]
totalSegments <- sum(freqTableCompany$Count)
freqTableCompany <- cbind(freqTableCompany, Percentage = freqTableCompany$Count/totalSegments * 100)
kable(freqTableCompany, digits = 2, format = "pipe")
=======
#Company
freqTableCompany <- cleanedList %>% group_by(Company = cleanedList$Company) %>% summarise(Count = n())
freqTableCompany <- freqTableCompany[order(freqTableCompany$Count, decreasing = TRUE),]
totalSegments <- sum(freqTableCompany$Count)
freqTableCompany <- cbind(freqTableCompany, Percentage = freqTableCompany$Count/totalSegments * 100)
kable(freqTableCompany, digits = 2, format = "pipe")
>>>>>>> 2eb627b3b503ce1522c2ee6032b390992962e732
Company Count Percentage
NULL 36952 92.24
223 784 1.96
281 138 0.34
154 133 0.33
405 100 0.25
94 87 0.22
135 64 0.16
331 58 0.14
498 58 0.14
47 56 0.14
110 51 0.13
20 50 0.12
342 48 0.12
270 43 0.11
195 38 0.09
113 36 0.09
174 36 0.09
204 34 0.08
307 34 0.08
269 33 0.08
308 32 0.08
86 32 0.08
343 29 0.07
178 27 0.07
169 26 0.06
337 25 0.06
507 23 0.06
477 22 0.05
88 22 0.05
9 22 0.05
286 21 0.05
523 19 0.05
144 18 0.04
31 17 0.04
103 16 0.04
290 16 0.04
292 16 0.04
251 15 0.04
397 15 0.04
525 15 0.04
62 15 0.04
12 14 0.03
268 14 0.03
274 14 0.03
346 14 0.03
82 14 0.03
112 13 0.03
355 13 0.03
390 13 0.03
51 13 0.03
81 13 0.03
92 13 0.03
291 12 0.03
338 12 0.03
367 12 0.03
380 12 0.03
99 12 0.03
130 11 0.03
371 11 0.03
399 11 0.03
43 11 0.03
504 11 0.03
108 10 0.02
323 10 0.02
360 10 0.02
324 9 0.02
356 9 0.02
83 9 0.02
317 8 0.02
34 8 0.02
379 8 0.02
384 8 0.02
39 8 0.02
421 8 0.02
428 8 0.02
53 8 0.02
118 7 0.02
167 7 0.02
225 7 0.02
263 7 0.02
297 7 0.02
329 7 0.02
388 7 0.02
437 7 0.02
521 7 0.02
59 7 0.02
120 6 0.01
159 6 0.01
22 6 0.01
364 6 0.01
394 6 0.01
511 6 0.01
515 6 0.01
16 5 0.01
254 5 0.01
255 5 0.01
28 5 0.01
287 5 0.01
302 5 0.01
382 5 0.01
42 5 0.01
459 5 0.01
470 5 0.01
490 5 0.01
530 5 0.01
116 4 0.01
148 4 0.01
192 4 0.01
353 4 0.01
358 4 0.01
392 4 0.01
465 4 0.01
137 3 0.01
146 3 0.01
165 3 0.01
200 3 0.01
207 3 0.01
240 3 0.01
277 3 0.01
282 3 0.01
330 3 0.01
366 3 0.01
369 3 0.01
378 3 0.01
395 3 0.01
40 3 0.01
445 3 0.01
448 3 0.01
457 3 0.01
494 3 0.01
512 3 0.01
72 3 0.01
14 2 0.00
168 2 0.00
224 2 0.00
232 2 0.00
250 2 0.00
272 2 0.00
289 2 0.00
29 2 0.00
312 2 0.00
319 2 0.00
325 2 0.00
370 2 0.00
391 2 0.00
403 2 0.00
409 2 0.00
423 2 0.00
436 2 0.00
443 2 0.00
444 2 0.00
447 2 0.00
456 2 0.00
458 2 0.00
460 2 0.00
482 2 0.00
484 2 0.00
513 2 0.00
514 2 0.00
518 2 0.00
52 2 0.00
528 2 0.00
534 2 0.00
539 2 0.00
543 2 0.00
61 2 0.00
78 2 0.00
84 2 0.00
10 1 0.00
102 1 0.00
104 1 0.00
109 1 0.00
126 1 0.00
184 1 0.00
193 1 0.00
203 1 0.00
212 1 0.00
218 1 0.00
242 1 0.00
246 1 0.00
278 1 0.00
318 1 0.00
32 1 0.00
333 1 0.00
347 1 0.00
349 1 0.00
351 1 0.00
361 1 0.00
362 1 0.00
365 1 0.00
372 1 0.00
373 1 0.00
376 1 0.00
377 1 0.00
383 1 0.00
386 1 0.00
396 1 0.00
398 1 0.00
400 1 0.00
401 1 0.00
402 1 0.00
407 1 0.00
408 1 0.00
410 1 0.00
413 1 0.00
415 1 0.00
416 1 0.00
419 1 0.00
422 1 0.00
424 1 0.00
425 1 0.00
435 1 0.00
439 1 0.00
442 1 0.00
454 1 0.00
455 1 0.00
461 1 0.00
466 1 0.00
478 1 0.00
485 1 0.00
486 1 0.00
487 1 0.00
491 1 0.00
496 1 0.00
499 1 0.00
501 1 0.00
506 1 0.00
516 1 0.00
520 1 0.00
531 1 0.00
54 1 0.00
541 1 0.00
6 1 0.00
64 1 0.00
77 1 0.00
80 1 0.00

Erkenntniss: Die Firma 223 ist ein grosser Kunde.

<<<<<<< HEAD
#Agent
freqTableAgent <- cleanedList %>% group_by(Agent = cleanedList$Agent) %>% summarise(Count = n())
freqTableAgent <- freqTableAgent[order(freqTableAgent$Count, decreasing = TRUE),]
totalSegments <- sum(freqTableAgent$Count)
freqTableAgent <- cbind(freqTableAgent, Percentage = freqTableAgent$Count/totalSegments * 100)
kable(freqTableAgent, digits = 2, format = "pipe")
=======
#Agent
freqTableAgent <- cleanedList %>% group_by(Agent = cleanedList$Agent) %>% summarise(Count = n())
freqTableAgent <- freqTableAgent[order(freqTableAgent$Count, decreasing = TRUE),]
totalSegments <- sum(freqTableAgent$Count)
freqTableAgent <- cbind(freqTableAgent, Percentage = freqTableAgent$Count/totalSegments * 100)
kable(freqTableAgent, digits = 2, format = "pipe")
>>>>>>> 2eb627b3b503ce1522c2ee6032b390992962e732
Agent Count Percentage
240 13905 34.71
NULL 8209 20.49
250 2869 7.16
241 1721 4.30
40 1002 2.50
314 927 2.31
242 779 1.94
6 607 1.52
96 537 1.34
243 514 1.28
298 472 1.18
171 363 0.91
273 349 0.87
177 327 0.82
196 291 0.73
134 287 0.72
8 278 0.69
315 256 0.64
15 242 0.60
38 236 0.59
5 228 0.57
115 225 0.56
251 220 0.55
68 211 0.53
175 195 0.49
156 190 0.47
208 173 0.43
143 172 0.43
142 137 0.34
147 133 0.33
410 133 0.33
248 131 0.33
67 127 0.32
146 124 0.31
95 120 0.30
26 106 0.26
11 105 0.26
2 102 0.25
464 97 0.24
330 91 0.23
69 88 0.22
253 87 0.22
185 78 0.19
339 77 0.19
36 71 0.18
71 71 0.18
75 70 0.17
531 68 0.17
281 64 0.16
385 60 0.15
181 59 0.15
155 58 0.14
440 56 0.14
332 55 0.14
1 54 0.13
308 54 0.13
184 52 0.13
152 51 0.13
249 51 0.13
495 50 0.12
468 49 0.12
436 47 0.12
127 45 0.11
183 45 0.11
305 45 0.11
368 45 0.11
201 42 0.10
168 40 0.10
66 39 0.10
261 38 0.09
245 37 0.09
375 37 0.09
313 36 0.09
493 35 0.09
527 35 0.09
306 34 0.08
434 33 0.08
387 32 0.08
479 32 0.08
94 29 0.07
149 28 0.07
3 28 0.07
334 28 0.07
350 28 0.07
492 28 0.07
467 27 0.07
252 26 0.06
91 26 0.06
257 24 0.06
47 24 0.06
502 24 0.06
256 23 0.06
336 23 0.06
348 22 0.05
310 20 0.05
57 20 0.05
88 19 0.05
104 18 0.04
223 18 0.04
327 18 0.04
411 16 0.04
360 15 0.04
105 14 0.03
126 14 0.03
307 14 0.03
10 13 0.03
128 13 0.03
393 13 0.03
110 12 0.03
526 10 0.02
324 9 0.02
328 9 0.02
139 8 0.02
275 8 0.02
418 8 0.02
481 8 0.02
78 8 0.02
163 7 0.02
154 6 0.01
363 6 0.01
508 6 0.01
9 6 0.01
270 5 0.01
326 5 0.01
405 5 0.01
429 5 0.01
16 4 0.01
195 4 0.01
244 4 0.01
254 4 0.01
29 4 0.01
430 4 0.01
455 4 0.01
258 3 0.01
302 3 0.01
321 3 0.01
420 3 0.01
426 3 0.01
535 3 0.01
72 3 0.01
135 2 0.00
180 2 0.00
282 2 0.00
384 2 0.00
414 2 0.00
427 2 0.00
438 2 0.00
454 2 0.00
469 2 0.00
510 2 0.00
114 1 0.00
159 1 0.00
165 1 0.00
167 1 0.00
182 1 0.00
187 1 0.00
193 1 0.00
291 1 0.00
300 1 0.00
301 1 0.00
303 1 0.00
304 1 0.00
331 1 0.00
333 1 0.00
335 1 0.00
337 1 0.00
34 1 0.00
352 1 0.00
355 1 0.00
358 1 0.00
367 1 0.00
390 1 0.00
406 1 0.00
431 1 0.00
432 1 0.00
433 1 0.00
441 1 0.00
446 1 0.00
450 1 0.00
451 1 0.00
472 1 0.00
476 1 0.00
483 1 0.00
497 1 0.00
59 1 0.00
64 1 0.00

Erkenntniss: Der Agent 240 betätigt über ein drittel der Reservationen.

<<<<<<< HEAD
#ArrivalDateYear
freqTableArrivalDateYear <- cleanedList %>% group_by(ArrivalDateYear = cleanedList$ArrivalDateYear) %>% summarise(Count = n())
freqTableArrivalDateYear <- freqTableArrivalDateYear[order(freqTableArrivalDateYear$Count, decreasing = TRUE),]
totalSegments <- sum(freqTableArrivalDateYear$Count)
freqTableArrivalDateYear <- cbind(freqTableArrivalDateYear, Percentage = freqTableArrivalDateYear$Count/totalSegments * 100)
kable(freqTableArrivalDateYear, digits = 2, format = "pipe")
=======
#ArrivalDateYear
freqTableArrivalDateYear <- cleanedList %>% group_by(ArrivalDateYear = cleanedList$ArrivalDateYear) %>% summarise(Count = n())
freqTableArrivalDateYear <- freqTableArrivalDateYear[order(freqTableArrivalDateYear$Count, decreasing = TRUE),]
totalSegments <- sum(freqTableArrivalDateYear$Count)
freqTableArrivalDateYear <- cbind(freqTableArrivalDateYear, Percentage = freqTableArrivalDateYear$Count/totalSegments * 100)
kable(freqTableArrivalDateYear, digits = 2, format = "pipe")
>>>>>>> 2eb627b3b503ce1522c2ee6032b390992962e732
ArrivalDateYear Count Percentage
2016 18567 46.35
2017 13179 32.90
2015 8314 20.75

Erkenntniss: Die Daten enthalten mit grosser Wahrscheindlichkeit nur Teildaten der Jahre 2015 und 2017.

Aufgabe (4 Punkte): Prüfe Auffälligkeiten

Erstelle eine tabellarische Häufigkeitsverteilung für das neu gebildete Attribut “HouseholdType” und untersuche und beschreibe Auffälligkeiten.

Hinweis: Verwende für deine Implementierung die Funktion kable().

<<<<<<< HEAD
#Erst möglich wenn die Aufgabe 4.9 abgeschlossen ist
#HouseholdType 
#freqTableHouseholdType <- cleanedList %>% group_by(HouseholdType = cleanedList$CustomerType) %>% summarise(Count = n())
#freqTableHouseholdType <- freqTableHouseholdType[order(freqTableHouseholdType$Count, decreasing = TRUE),]
#totalSegments <- sum(freqTableHouseholdType$Count)
#freqTableHouseholdType <- cbind(freqTableHouseholdType, Percentage = freqTableHouseholdType$Count/totalSegments * 100)
#kable(freqTableHouseholdType, digits = 2, format = "pipe")
=======
#Erst möglich wenn die Aufgabe 4.9 abgeschlossen ist
#HouseholdType 
#freqTableHouseholdType <- cleanedList %>% group_by(HouseholdType = cleanedList$CustomerType) %>% summarise(Count = n())
#freqTableHouseholdType <- freqTableHouseholdType[order(freqTableHouseholdType$Count, decreasing = TRUE),]
#totalSegments <- sum(freqTableHouseholdType$Count)
#freqTableHouseholdType <- cbind(freqTableHouseholdType, Percentage = freqTableHouseholdType$Count/totalSegments * 100)
#kable(freqTableHouseholdType, digits = 2, format = "pipe")
>>>>>>> 2eb627b3b503ce1522c2ee6032b390992962e732

Aufgabe (3 Punkte): Prüfe weitere Auffälligkeiten

Erstelle eine Statistik für das Attribut “AverageDailyRate” und identifiziere Auffälligkeiten.

<<<<<<< HEAD
dataFrameDates <- dataFrame
dataFrameDates <- cbind(dataFrameDates, ArrivalDate = mdy(str_c(str_c(dataFrameDates$ArrivalDateMonth, dataFrameDates$ArrivalDateDayOfMonth, sep = " "), dataFrameDates$ArrivalDateYear, sep = ", ")))
dataFrameDates <- dataFrameDates[order(dataFrameDates$ArrivalDate), ]
plot(dataFrameDates$AverageDailyRate)

ggplot(dataFrameDates, aes(x = dataFrameDates$ArrivalDate, y = dataFrameDates$AverageDailyRate))+geom_point()+geom_smooth()

NA
NA
NA
=======
dataFrameDates <- dataFrame
dataFrameDates <- cbind(dataFrameDates, ArrivalDate = mdy(str_c(str_c(dataFrameDates$ArrivalDateMonth, dataFrameDates$ArrivalDateDayOfMonth, sep = " "), dataFrameDates$ArrivalDateYear, sep = ", ")))
dataFrameDates <- dataFrameDates[order(dataFrameDates$ArrivalDate), ]
plot(dataFrameDates$AverageDailyRate)

ggplot(dataFrameDates, aes(x = dataFrameDates$ArrivalDate, y = dataFrameDates$AverageDailyRate))+geom_point()+geom_smooth()

NA
NA
NA
>>>>>>> 2eb627b3b503ce1522c2ee6032b390992962e732

Identifizierte Auffälligkeiten: Im Sommer werden höhere Preise gezahlt. Spezielle Tage:

Aufgabe (2 Punkte): Erstelle einen bereinigten Datensatz

Bereinige das Data Frame, indem du Beobachtungen mit Auffälligkeiten und unplausiblen Werten in den Attributen “AverageDailyRate” und “HouseholdType” entfernst.

 

FÜR ALLE WEITEREN ANALYSEN IST AUSSCHLIESSLICH DER BEREINIGTE DATENSATZ ZU VERWENDEN!!!

Visualisierung

FÜR ALLE WEITEREN ANALYSEN IST AUSSCHLIESSLICH DER BEREINIGTE DATENSATZ ZU VERWENDEN!!!

Aufgabe (5 Punkte): Analysiere Zusammenhänge kategorialer Grössen

Erstelle eine graphische Analyse, welche die relativen Unterschiede des Auftretens von Spezialwünschen (s. “TotalSpecialRequests”) bei Hotelreservationen nach Haushaltstyp (s. “HouseholdType”) untersucht und zusätzlich betrachtet, ob die Buchung storniert wurde oder nicht (s. “BookingCancelled”).

Hinweis: Verwende für deine Implementierung die Funktion facet_wrap(, labeller = ...).

Aufgabe (5 Punkte): Erstelle eine visuelle Häufigkeitstabelle

Erstelle eine Heatmap, welche das Vorkommen von Art des Aufenthalts und Haushaltstyp farblich und in Zahlen darstellt.

Hinweis: Verwende für deine Implementierung die Funktion geom_tile() und eine Farbskala, welche grosse Häufigkeiten dunkler einfärbt als kleine.

Aufgabe (5 Punkte): Erstelle einen Mosaic-Plots

Erstelle analog zur Heatmap oben einen Mosaicplot, welcher das Vorkommen von Art des Aufenthalts und Haushaltstyp darstellt (Farben können frei gewählt werden, Zahlen sind nicht im Plot zu integrieren).

Hinweis: Verwende für deine Implementierung die Funktion geom_mosaic() aus dem Paket ggmosaic.

Aufgabe (10 Punkte): Analysiere die Definition des Tagesdurchschnittpreises

Plausibilisiere visuell, dass die Angaben des Attributs Tagesdurchschnittpreis (“AverageDailyRate”) sich nicht auf den Preis pro Übernachtung und Person, sondern auf den Preis pro Übernachtung pro Zimmer beziehen.

Hinweis: Die Visualisierung ist kein abschliessender Beweis. Beschreibe klar und nachvollziehbar, wieso die von dir gezeigte Grafik ein Indiz dafür ist, dass sich die gelisteten Tagesdurchschnittpreise auf Übernachtungen pro Zimmer beziehen.

Aufgabe (10 Punkte): Plausibilisiere Interpretation des Tagesdurchschnittpreises

Identifiziere drei Fälle, welche illustrieren, dass die Angaben des Attributs Tagesdurchschnittpreis (“AverageDailyRate”) sich auf den Preis pro Übernachtung pro Zimmer beziehen, indem du gezielt paarweise Buchungen vergleichst, wo sich Anzahl Personen und Tagesdurchschnittpreis unterscheiden, andere relevante Variablen aber übereinstimmen.

Gib für diese drei Fälle folgende Attribute aus: “GroupSize.x”, “GroupSize.y”, “AverageDailyRate.x”, “AverageDailyRate.y” (die Endung “.x” bezieht sich auf das Attribut der ersten, “.y” der zweiten Beobachtung der paarweisen Buchung).

Hinweis: Exploriere Beispiele von Hand und mache dann ein Refactoring deines Codes, d.h. verwende für deine Implementierung eine eigene Funktion mit {{}}, so dass eine wählbare Menge zufälliger Beispiele selektiert werden kann.

Aufgabe (5 Punkte): Erstelle Facet-Plot des Tagesdurchschnittpreises

Reproduziere die folgende Grafik (“Figure 1: AverageDailyRate_2016_RoomA”) für die Verteilung der monatlichen Tagesdurchschnittpreise (“AverageDailyRate”) von Zimmern mit AssignedRoomType “A” für das Jahr 2016 mit allen gezeigten Details.

AverageDailyRate_2016_RoomA

Aufgabe (5 Punkte): Verbessere Facet-Plot des Tagesdurchschnittpreises

Verbessere die vorangehende Grafik so, dass die Reihenfolge der Monate chronologisch geordnet ist.

Aufgabe (5 Punkte): Reproduziere Facet-Plot des Tagesdurchschnittpreises

Reproduziere die folgende Grafik (“Figure 2: AverageDailyRate_RoomsACDEFG.png”) mit allen gezeigten Details für die Verteilung der Tagesdurchschnittpreise (“AverageDailyRate”) von Zimmern mit AssignedRoomType “A”, “C”, “D”, “E”, “F” und “G” ohne Beschränkung des Zeitraumes.

AverageDailyRate_RoomsACDEFG.png

Aufgabe (5 Punkte): Vereinfache Facet-Plot des Tagesdurchschnittpreises

Erzeuge für die oben dargestellten Daten nun Boxplots zum Vergleich von Tagesdurchschnittpreisen (“AverageDailyRate”) nach Zimmertyp (“AssignedRoomType”) und visualisiere die Gruppengrösse mit Hilfe der Fläche der Box.

Aufgabe (5 Punkte): Untersuche und visualisiere Korrelationen

Berechne die Korrelation nach Bravais-Pearson für die Attribute Preis (Attribut “Price”) und Anzahl Übernachtungen (Attribut “TotalNights”). Erstelle weiter ein Streudiagramm für “Price” vs “TotalNights” und integriere im Untertitel die Information der Anzahl Beobachtungen und der berechneten Korrelation auf drei Nachkommastellen gerundet.

Hinweis: Verwende für deine Implementierung die Funktion geom_jitter() mit sinnvoller Wahl der Parameter alpha und shape.

Aufgabe (10 Punkte): Bereinigung von Ausreissern

Erstelle das obige Streudiagramm für “Price” vs “TotalNights” erneut und schränke die x-Achse und y-Achse so ein, dass Aussreisser am oberen Ende der Skala nicht gezeigt werden. Passe den Untertitel an, indem du erwähnst wieviele Ausreisser nicht gezeigt werden.

Hinweis: Verwende für deine Implementierung die Definition des Boxplots: Ausreißer sind Datenpunkte, die sich ausserhalb der Zäune (“Whiskers”) des Boxplots befinden. Die Whiskers haben die Länge des 1,5-fachen des Interquartilsbereichs und setzen oberhalb des oberen Quartils und unterhalb des unteren Quartils an.

Aufgabe (10 Punkte): Untersuche den Zeitverlauf der Hotelankünfte

Visualisiere die Anzahl der Hotelbuchungen nach Ankunftsdatum im Zeitverlauf, wobei die stornierten Buchungen nicht zu berücksichtigen sind. Visualisiere den Verlauf über 180 Tage, beginnend am 1. Juni 2016.

Hinweis: Verwende für deine Implementierung tidyverse und lubridate.

Aufgabe (5 Punkte): Identifiziere Tage mit meisten Buchungen

Identifiziere die fünf Tage mit den meisten Zimmer-Buchungen gemessen am Datum der Ankunft, wobei die stornierten Buchungen nicht zu berücksichtigen sind. Gib zusätzlich die Anzahl Personen an, welche an diesen Tagen eingecheckt haben.

Aufgabe (10 Punkte): Untersuche den Zeitverlauf des mittleren Tagesdurchschnittspreise der Buchungen

Berechne für 2016 die zeitliche Entwicklung des Tagesdurchschnittspreises (“AverageDailyRate”) aller Buchungen pro Woche. Visualisiere den Median sowie das 25%-Perzentil und 75%-Perzentil, um die Streuung des Tagesdurchschnittspreises zu illustrieren.

Bestimme und markiere dann visuell die Kalenderwoche mit dem höchsten Tagesdurchschnittspreis mit Hilfe einer vertikalen roten Linie.

Eigene Analysen

Aufgabe (20 Punkte): Exploriere den Datensatz weiter

Untersuche weitere, noch nicht beleuchtete Zusammenhänge in den Daten und dokumentiere (a) deine Hypothese, (b) die gefundenen Zusammenhängen präzise in Worten.

LS0tCnRpdGxlOiAiRURBIEhTMjIgLSBNaW5pLUNoYWxsZW5nZTogSG90ZWxidWNodW5nZW4iCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogJzQnCiAgICBkZl9wcmludDogcGFnZWQKICAgIHRvY19mbG9hdDogdHJ1ZQogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiA0CiAgICBkZl9wcmludDogcGFnZWQKICAgIHRvY19mbG9hdDoKICAgICAgY29sbGFwc2VkOiB5ZXMKICAgICAgc21vb3RoX3Njcm9sbDogeWVzCiAgICB0aGVtZTogdW5pdGVkCiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKLS0tCgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgombmJzcDsKCioqQmVnaW5uOiAxNS4xMS4yMDIyLCAwODoxNSoqCgoqKkVuZGU6IDI1LjExLjIwMjIsIDIzOjU5KioKCiZuYnNwOwoKKipBYmdhYmU6IFBybyBad2VpZXJncnVwcGUgZWluIC5SbWQgdW5kIC5odG1sIEZpbGUgdmlhIGUtbWFpbCBhbiBkYW5pZWwucGVycnVjaG91ZEBmaG53LmNoKioKCiZuYnNwOwoKKipWb3JuYW1lLCBOYW1lOioqCgombmJzcDsKCioqVm9ybmFtZSwgTmFtZToqKgoKJm5ic3A7CgoqKkVycmVpY2h0ZSBQdW5rdHphaGw6KioKCiZuYnNwOwoKCioqTm90ZToqKgoKCiZuYnNwOwogCioqSGllcm1pdCBlcmtsw6RyZW4gd2lyLCBkYXNzIGRpZSB2b3JsaWVnZW5kZSBBcmJlaXQgc2VsYnN0w6RuZGlnIHVuZCBvaG5lIEhpbGZlIHdlaXRlcmVyIFBlcnNvbmVuIGVyYXJiZWl0ZXQgdW5kIGdlc2NocmllYmVuIHd1cmRlIHVuZCBhdWNoIG5pY2h0IGFuIGFuZGVyZSBQZXJzb25lbiB3ZWl0ZXJnZXJlaWNodCB3dXJkZSB1bmQgd2lyZC4qKgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoKIyBFaW5mw7xocnVuZyAKCiMjIEJldXJ0ZWlsdW5nc2tyaXRlcmllbgoKQmV1cnRlaWx0IHdlcmRlbiBVbWZhbmcsIEluaGFsdCB1bmQgRm9ybSBkZXIgQWJnYWJlIGplZGVyIEdydXBwZTsgZGllIHBybyBBdWZnYWJlIGVyd29yYmVuZW4gUHVua3RlemFobCBiZXN0aW1tdCBzaWNoIGF1cyBWb2xsc3TDpG5kaWdrZWl0LCBLb3JyZWt0aGVpdCBkZXIgQW5hbHlzZSBzb3dpZSBRdWFsaXTDpHQgZGVyIENvZGllcnVuZy4gCgpEaWUgKiptYXhpbWFsZSoqIEFuemFobCBtw7ZnbGljaGVyIFB1bmt0ZSBpc3QgaGludGVyIGplZGVyIEF1ZmdhYmUgdmVybWVya3QuCgpTcHJhY2hlOiBFbXBmb2hsZW4gaXN0IGluIGRlbiBDb2RlcywgR3JhZmlrZW4gdW5kIFRhYmVsbGVuIGtvbnNpc3RlbnQgRW5nbGlzY2ggenUgdmVyd2VuZGVuLCBkYW1pdCBkaWUgTmFtZW4gZGVyIEF0dHJpYnV0ZSBuaWNodCDDvGJlcnNldHp0IHdlcmRlbiBtw7xzc2VuLiAKClZpc3VhbGlzaWVydW5nOiBCaXR0ZSBhY2h0ZXQgZGFyYXVmLCBkYXNzIGFsbGUgR3JhZmlrZW4gw7xiZXJzaWNodGxpY2ggdW5kIHZvbGxzdMOkbmRpZyBiZXNjaHJpZnRldCB1bmQga29sb3JpZXJ0IHNpbmQgdW5kIGRpZSBBcnQgZGVyIHZlcndlbmRldGVuIEdyYWZpayBlbnRzcHJlY2hlbmQgZGVtIERhdGVudHlwIHNpbm52b2xsIGdld8OkaGx0IGlzdC4gCgpEb2t1bWVudGF0aW9uOiBLb21tZW50aWVydCBldXJlIENvZGVzLCB3byBzcGV6aWVsbGUgw5xiZXJsZWd1bmcgZWluZmxpZXNzZW4gdW5kIGJlc2NocmVpYnQgZGllIFJlc3VsYXRlIGRlciBBbmFseXNlbiBpbiB3ZW5pZ2VuIFPDpHR6ZW4gcHLDpHppc2UuCgoKIyMgRGF0ZW5iZXNjaHJlaWJ1bmcKCklociBlcmhhbHRldCBEYXRlbiB2b24gNDAnMDYwIEhvdGVsYnVjaHVuZ2VuIHVuZCBkZW4gQXVmdHJhZyBkaWVzZSB6dSBhbmFseXNpZXJlbi4gUHJvIEJ1Y2h1bmcgc3RlaGVuIGRpZSBmb2xnZW5kZW4gMzEgQXR0cmlidXRlIHp1ciBWZXJmw7xndW5nICh6dXNhbW1lbmdlaMO2cmVuZGUgQXR0cmlidXRlIHdlcmRlbiBnZW1laW5zYW0gYmVzY2hyaWViZW4pLgoKMS4gSXNDYW5jZWxlZDogSW5mb3JtYXRpb24sIG9iIGRpZSBCdWNodW5nIHN0b3JuaWVydCB3dXJkZSwKMi4gTGVhZFRpbWU6IEFuemFobCBUYWdlIHp3aXNjaGVuIEJ1Y2h1bmcgdW5kIEVpbnRyZWZmZW4gaW0gSG90ZWwsCjMuIEFycml2YWxEYXRlWWVhciwgLU1vbnRoLCAtRGF0ZVdlZWtOdW1iZXIsIERhdGVEYXlPZk1vbnRoOiBJbmZvcm1hdGlvbiB6dW0gWmVpdHB1bmt0IGRlcyBFaW50cmVmZmVucyBpbSBIb3RlbCwKNC4gU3RheXNJbldlZWtlbmROaWdodHMsIFN0YXlzSW5XZWVrTmlnaHRzOiBBbnphaGwgZ2VidWNodGVyIE7DpGNodGUgYW0gV29jaGVuZW5kZSwgYnp3LiBhbiBXZXJrdGFnZW4sCjUuIEFkdWx0cywgQ2hpbGRyZW4sIEJhYmllczogQW56YWhsIEVyd2FjaHNlbmUsIEtpbmRlciB1bmQgQmFiaWVzIHBybyBCdWNodW5nLAo2LiBNZWFsOiBBcnQgZGVzIGdlYnVjaHRlbiBWZXJwZmxlZ3VuZ2VuLCBkLmguIEJCIChCZWQgJiBCcmVha2Zhc3QpLCBIQiAoSGFsZiBib2FyZCBvZGVyIEhhbGJwZW5zaW9uKSwgRkIgKEZ1bGwgYm9hcmQgb2RlciBWb2xscGVuc2lvbiksIFVuZGVmaW5lZCAoa2VpbiBQYWtldCksCjcuIENvdW50cnk6IEhlcmt1bmZ0c2xhbmQgZGVzIEdhc3RlcywKOC4gTWFya2V0U2VnbWVudDogTWFya3RzZWdtZW50IGRlciBCdWNodW5nLCB3aWUgei5CLiBHZXNjaMOkZnRza3VuZGUsIERpcmVrdGt1bmRlLCBHcnVwcGUgKFRBID0gVG91ciBBZ2VudHMsIFRPID0gVG91ciBPcGVyYXRvcnMpLAo5LiBEaXN0cmlidXRpb25DaGFubmVsOiBWZXJ0cmllYnNrYW5hbCBkZXIgQnVjaHVuZyAoVEEgPSBUb3VyIEFnZW50cywgVE8gPSBUb3VyIE9wZXJhdG9ycyksCjEwLiBJc1JlcGVhdGVkR3Vlc3Q6IEluZm9ybWF0aW9uLCBvYiBkaWUgQnVjaHVuZyBlaW5lbSBmcsO8aGVyZW4gR2FzdCB6dWdld2llc2VuIHdlcmRlbiBrYW5uLAoxMS4gUHJldmlvdXNDYW5jZWxsYXRpb25zOiBJbmZvcm1hdGlvbiB6dXIgQW56YWhsIGZyw7xoZXJlciBTdG9ybmllcnVuZ2VuIGRlcyBHYXN0ZXMsCjEyLiBQcmV2aW91c0Jvb2tpbmdzTm90Q2FuY2VsZWQ6IEluZm9ybWF0aW9uIHp1ciBBbnphaGwgZnLDvGhlcmVyIEJ1Y2h1bmcgZGVzIEdhc3RlcyBvaG5lIFN0b3JuaWVydW5nLAoxMy4gUmVzZXJ2ZWRSb29tVHlwZSAvIEFzc2lnbmVkUm9vbVR5cGU6IHJlc2VydmllcnRlciBaaW1tZXJ0eXAsIGJ6dy4gdGF0c8OkY2hsaWNoIGJlem9nZW5lciBaaW1tZXJ0eXAsCjE0LiBCb29raW5nQ2hhbmdlczogQW56YWhsIEFucGFzc3VuZ2VuIGRlciBCdWNodW5nIGJpcyB6dW0gQ2hlY2stSW4gYnp3LiBiaXMgenVyIFN0b3JuaWVydW5nLAoxNS4gRGVwb3NpdFR5cGU6IEFydCBkZXIgYmVpIEJ1Y2h1bmcgaGludGVybGVndGVuIFNpY2hlcmhlaXQuIE5vbi1SZWZ1bmRhYmxlIGJlZGV1dGV0IGRlciBHZXNhbXRiZXRyYWcgd3VyZGUgYmV6YWhsdCB1bmQga2FubiBuaWNodCB6dXLDvGNrZ2Vmb3JkZXJ0IHdlcmRlbiwgUmVmdW5kYWJsZSBiZWRldXRldCBlaW4gVGVpbGJldHJhZyB3dXJkZSBiZXphaGx0IHVuZCBrYW5uIHp1csO8Y2tnZWZvcmRlcnQgd2VyZGVuLAoxNi4gQWdlbnQgLyBDb21wYW55OiBBZ2VudHVyIGJ6dy4gRmlybWEsIHdlbGNoZSBkaWUgQnVjaHVuZyBkdXJjaGdlZsO8aHJ0IGhhdCwKMTcuIERheXNJbldhaXRpbmdMaXN0OiBBbnphaGwgVGFnZSBiaXMgZGVyIEdhc3QgZGllIEJlc3TDpHRpZ3VuZyBmw7xyIGRpZSBCdWNodW5nIGVyaGFsdGVuIGhhdCwKMTguIEN1c3RvbWVyVHlwZTogS3VuZGVuYXJ0IGRlcyBHYXN0ZXMsCjE5LiBBRFI6IEF2ZXJhZ2UgRGFpbHkgUmF0ZSBpbiBFVVJPLCBkLmguIGR1cmNoc2Nobml0dGxpY2ggYmV6YWhsdGVyIFByZWlzIHBybyDDnGJlcm5hY2h0dW5nCjIwLiBSZXF1aXJlZENhclBhcmtpbmdTcGFjZXM6IEFuemFobCBmw7xyIGRlbiBHYXN0IGJlbsO2dGlndGVyIFBhcmtwbMOkdHplLAoyMS4gVG90YWxPZlNwZWNpYWxSZXF1ZXN0czogQW56YWhsIHNwZXppZWxsZXIgQW5mcmFnZW4gZGVzIEdhc3RlcyAoei5CLiBLaW5kZXJiZXR0LCBEb3BwZWxiZXR0KSwKMjIuIFJlc2VydmF0aW9uU3RhdHVzOiBsZXR6dGVyIFN0YXR1cyBkZXIgQnVjaHVuZyAoQ2hlY2stT3V0LCBOby1TaG93LCBDYW5jZWxlZCksCjIzLiBSZXNlcnZhdGlvblN0YXR1c0RhdGU6IGxldHp0ZXIgU3RhdHVzw6RuZGVydW5nIGRlciBCdWNodW5nLgoKCiMgQW5hbHlzZW4gdm9yYmVyZWl0ZW4KCiMjIEF1ZmdhYmUgKDEgUHVua3QpOiBMYWRlIGRpZSBBbmFseXNlLVBha2V0ZQoKTGFkZSBkaWUgZsO8ciBkaWUgQW5hbHlzZW4gcmVsZXZhbnRlbiBQYWtldGUuCgpIaW53ZWlzOiBWZXJ3ZW5kZSBmw7xyIGRlaW5lIEltcGxlbWVudGllcnVuZyBgdGlkeXZlcnNlYCwgZsO8ciBaZWl0cmVpaGVuYW5hbHlzZSBgbHVicmlkYXRlYCB1bmQgenVzw6R0emxpY2ggYGdnbW9zYWljYCB1bmQgYGtuaXRyYC4KCgpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkobHVicmlkYXRlKQpsaWJyYXJ5KGdnbW9zYWljKQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGdncGxvdDIpCmBgYAoKCiMgRGF0ZW4gbGFkZW4gdW5kIGluc3BpemllcmVuCgojIyBBdWZnYWJlICgxIFB1bmt0KTogTGFkZSBkaWUgRGF0ZW4KCkxhZGUgZGllIHp1IGFuYWx5c2llcmVuZGVuIERhdGVuLgoKSGlud2VpczogVmVyd2VuZGUgZsO8ciBkZWluZSBJbXBsZW1lbnRpZXJ1bmcgZGllIEZ1bmt0aW9uIGByZWFkLmNzdigpYCB1bmQgZGFzIEZpbGUgIkgxLmNzdiIuCgpgYGB7cn0KcGF0aERlbmlzIDwtICJDOi9Vc2Vycy9kZW5pcy9PbmVEcml2ZS9Eb2t1bWVudGUvRkhOVy8xLlNlbS9lZGEvSG90ZWxjaGFsbGVuZ2UvRGF0ZW4vSFMyMl9FREFfTUMvSDEuY3N2IgpwYXRoRmxhdmlvIDwtICIvVXNlcnMvZmxhdmlvL0xpYnJhcnkvQ2xvdWRTdG9yYWdlL09uZURyaXZlLUZITlcvRURBL0hTMjJfRURBX01DL0gxLmNzdiIKZGF0YUZyYW1lIDwtIHJlYWQuY3N2KCIvVXNlcnMvZmxhdmlvL0xpYnJhcnkvQ2xvdWRTdG9yYWdlL09uZURyaXZlLUZITlcvRURBL0hTMjJfRURBX01DL0gxLmNzdiIpCgpkYXRhRnJhbWUKYGBgCgoKIyMgQXVmZ2FiZSAoMSBQdW5rdCk6IFVudGVyc3VjaGUgZGllIEdyw7Zzc2UgZGVzIERhdGEgRnJhbWVzCgpHaWIgZsO8ciBkaWUgZWluZ2VsZXNlbmVuIERhdGVuIGRpZSBBbnphaGwgQmVvYmFjaHR1bmdlbiB1bmQgQXR0cmlidXRlIGF1cy4KCmBgYHtyfQpjb3VudChkYXRhRnJhbWUpICNBbnphaGwKYXR0cmlidXRlcyhkYXRhRnJhbWUpICNBdHRyaWJ1dGUKYGBgCgojIyBBdWZnYWJlICgxIFB1bmt0KTogSW5zcGl6aWVyZSBkaWUgRGF0ZW5pbmhhbHRlCgpHaWIgZWluZSBadWZhbGxzc3RpY2hwcm9iZSB2b24gNSBCZW9iYWNodHVuZ2VuIGF1cyAodmVyd2VuZGUgYWxzIFNlZWQgZGllIFphaGwgNDcxMSkgdW5kIHZlcnNjaGFmZmZlIGRpciBlaW5lbiDDnGJlcmJsaWNrIMO8YmVyIGRpZSBEYXRlbi4KCmBgYHtyfQpzZXQuc2VlZCg0NzExKQpzYW1wbGVSb3dzIDwtIHNhbXBsZSgxOm5yb3coZGF0YUZyYW1lKSwgNSkKc2xpY2UoZGF0YUZyYW1lLCBzYW1wbGVSb3dzKQpgYGAKCgojIyBBdWZnYWJlICgxIFB1bmt0KTogVW50ZXJzdWNoZSBTdHJ1a3R1ciB1bmQgRGF0ZW50eXBlbgoKR2liIGRpZSBTdHJ1a3R1ciBkZXMgRGF0YSBGcmFtZXMgYXVzIHVuZCB2ZXJzY2hhZmZlIGRpciBlaW5lbiDDnGJlcmJsaWNrIMO8YmVyIGRpZSBEYXRlbnR5cGVuLgoKYGBge3J9CmdsaW1wc2UoZGF0YUZyYW1lKQpgYGAKCgojIyBBdWZnYWJlICgyIFB1bmt0ZSk6IElkZW50aWZpemllcmUgRHVwbGlrYXRlIAoKQmVzdGltbWUgd2lldmllbGUgZG9wcGVsdGUgQmVvYmFjaHR1bmdlbiBpbSBEYXRhIEZyYW1lIGF1ZnRhdWNoZW4uCgpIaW53ZWlzOiBBdWZncnVuZCBmZWhsZW5kZXIgSGludGVyZ3J1bmRpbmZvcm1hdGlvbmVuIHdlcmRlbiBmw7xyIGRpZSBuw6RjaHN0ZW4gU2Nocml0dGUgenVuw6RjaHN0IGtlaW5lIEJlb2JhY2h0dW5nZW4gZW50ZmVybnQsIGF1Y2ggd2VubiBpbSBEYXRlbnNhdHogdmllbCByZWR1bmRhbnRlIEluZm9ybWF0aW9uZW4gdm9yaGFuZGVuIHNpbmQhCgpgYGB7cn0KZHVwbGljYXRlTGlzdCA8LSBkYXRhRnJhbWVbZHVwbGljYXRlZChkYXRhRnJhbWUpLCBdCm5ld0xpc3QgPC0gZHVwbGljYXRlTGlzdCAlPiUgZ3JvdXBfYnlfYWxsKCkgJT4lIHN1bW1hcmlzZShuID0gbigpKQpwcmludChzdW0obmV3TGlzdCRuKSkKYGBgCgojIyBBdWZnYWJlICgxMCBQdW5rdGUpOiBJZGVudGlmaXppZXJlIEdydXBwZW4gZG9wcGVsdGVyIEJlb2JhY2h0dW5nZW4KCkRvcHBlbHRlIEJlb2JhY2h0dW5nZW4gdHJldGVuIGltIHZvcmxpZWdlbmRlbiBEYXRlbnNhdHogaW4gdW50ZXJzY2hpZWRsaWNoZXIgR3J1cHBpZXJ1bmcgYXVmOiBlcyBnaWJ0IEJlb2JhY2h0dW5nZW4sIGRpZSBudXIgendlaW1hbCwgYWJlciBhdWNoIEJlb2JhY2h0dW5nZW4sIGRpZSBtZWhyIGFscyBlaW4gRHV0emVuZCBtYWwgdm9yaGFuZGVuIHNpbmQuIEdpYiBmw7xyIGRpZSB2aWVyIEdydXBwaWVydW5nZW4gbWl0IGRlbiBtZWlzdGVuIGRvcHBlbHRlbiBCZW9iYWNodHVuZ2VuIGplIGVpbmUgdm9sbHN0w6RuZGlnZSBCZW9iYWNodHVuZyBhdXMuCgpIaW53ZWlzOiBBdWZncnVuZCBmZWhsZW5kZXIgSGludGVyZ3J1bmRpbmZvcm1hdGlvbmVuIHdlcmRlbiBmw7xyIGRpZSBuw6RjaHN0ZW4gU2Nocml0dGUgenVuw6RjaHN0IGtlaW5lIEJlb2JhY2h0dW5nZW4gZW50ZmVybnQsIGF1Y2ggd2VubiBpbSBEYXRlbnNhdHogdmllbCByZWR1bmRhbnRlIEluZm9ybWF0aW9uZW4gdm9yaGFuZGVuIHNpbmQhCgpgYGB7cn0KYmlnZ2VzdER1cGxpY2F0ZXMgPC0gbmV3TGlzdFtvcmRlcihuZXdMaXN0JG4sIGRlY3JlYXNpbmcgPSBUUlVFKSxdCgpiaWdnZXN0RHVwbGljYXRlcyA8LSBiaWdnZXN0RHVwbGljYXRlc1sxOjQsXQoKYGBgCgoKIyBEYXRlbiB0cmFuc2Zvcm1pZXJlbgoKIyMgQXVmZ2FiZSAoMiBQdW5rdGUpOiBCZW5lbm5lIEF0dHJpYnV0ZSB1bQoKRGllIGZvbGdlbmRlbiBBdHRyaWJ1dGUgc2luZCBuZXUgenUgYmVuZW5uZW4gKGFsdGVyTmFtZSAtPiBuZXVlck5hbWUpCgotIFRvdGFsT2ZTcGVjaWFsUmVxdWVzdHMgLT4gVG90YWxTcGVjaWFsUmVxdWVzdHMKLSBBRFIgLT4gQXZlcmFnZURhaWx5UmF0ZQotIElzQ2FuY2VsZWQgLT4gQm9va2luZ0NhbmNlbGxlZAoKYGBge3J9CiNuYW1lcyhkYXRhRnJhbWUpCgpkYXRhRnJhbWUgPC0gZGF0YUZyYW1lICU+JSByZW5hbWUoCiAgQm9va2luZ0NhbmNlbGxlZCA9IElzQ2FuY2VsZWQsIAogIEF2ZXJhZ2VEYWlseVJhdGUgPSBBRFIsCiAgVG90YWxTcGVjaWFsUmVxdWVzdHMgPSBUb3RhbE9mU3BlY2lhbFJlcXVlc3RzCiAgKQoKYGBgCgoKIyMgQXVmZ2FiZSAoMiBQdW5rdGUpOiBFbnRmZXJuZSBMZWVyemVpY2hlbgoKRW50ZmVybmUgKmdsZWljaHplaXRpZyBmw7xyIGFsbGUqIGNoYXJhY3Rlci13ZXJ0aWdlbiBBdHRyaWJ1dGUsIGRpZSBMZWVyemVpY2hlbiwgd2VsY2hlIHZvciBvZGVyIG5hY2ggZGVtIFRleHQgYXVmdGF1Y2hlbi4KCkhpbndlaXM6IFZlcndlbmRlIGbDvHIgZGVpbmUgSW1wbGVtZW50aWVydW5nIGRpZSBGdW5rdGlvbiBgYWNyb3NzKClgIHVuZCBkZW4gUG9zdCBbVW1nYW5nIG1pdCB0ZXh0dWVsbGVuIERhdGVuIG1pdCB0aWR5dmVyc2UncyBzdHJpbmdyXShodHRwczovL3NwYWNlcy50ZWNobmlrLmZobncuY2gvc3BhY2VzL2V4cGxvcmF0aXZlLWRhdGVuYW5hbHlzZS9iZWl0cmFlZ2UvdW1nYW5nLW1pdC10ZXh0dWVsbGVuLWRhdGVuLW1pdC10aWR5dmVyc2VzLXN0cmluZ3IpLgoKCmBgYHtyfQpsaWJyYXJ5KHN0cmluZ3IpCmRhdGFGcmFtZSA8LSBkYXRhRnJhbWUgJT4lCiAgbXV0YXRlKGFjcm9zcyh3aGVyZShpcy5jaGFyYWN0ZXIpLCBzdHJfdHJpbSkpCgojZ2xpbXBzZShkYXRhRnJhbWUpCiAgCmBgYAoKCiMjIEF1ZmdhYmUgKDIgUHVua3RlKTogVW50ZXJzdWNoZSBmZWhsZW5kZSBJbmZvcm1hdGlvbmVuCgpVbnRlcnN1Y2hlIGFsbGbDpGxsaWdlIGZlaGxlbmRlIEluZm9ybWF0aW9uZW4gKE5BcykgaW0gRGF0YSBGcmFtZSB1bmQgesOkaGxlIHdpZXZpZWxlIE5BcyB2b3Jrb21tZW4uIAoKYGBge3J9CiNBdWZwYXNzZW4gYmVpIGJlc3RpbW10ZW4gRnVua3Rpb25lbiB3ZXJkZW4gZmVobGVuZGUgSW5mb3JtYXRpb25lbiBhdXRvbWF0aXNjaCBhbHMgTi9BIGthdGVnb3Jpc2llcnQKI0tlaW5lIE5BcyB2b3JoYW5kZW4sIGdpYnQgZXMgZmVobGVuZGUgSW5mb3JtYXRpb25lbj8Kc2FwcGx5KGRhdGFGcmFtZSwgZnVuY3Rpb24oeCkgc3VtKGlzLm5hKHgpKSkKCmBgYAoKCiMjIEF1ZmdhYmUgKDMgUHVua3RlKTogRXJzZXR6ZSAiTlVMTCIgV2VydGUKCkVyc2V0emUgKmdsZWljaHplaXRpZyBhbGxlKiBXZXJ0ZSAiTlVMTCIgZsO8ciBkaWUgQXR0cmlidXRlICJDb21wYW55IiB1bmQgIkFnZW50IiBkdXJjaCBgTkFgIHVuZCB1bmQgesOkaGxlIHdpZXZpZWxlIE5BcyBpbiBqZWRlbSBkZXIgYmVpZGVuIEF0dHJpYnV0ZW4gdm9ya29tbWVuLgoKYGBge3J9CiMhISFGdW5rdGlvbmllcnQgYWJlciDDpG5kZXJ0IG51ciBkaWUgTmFtZW4gbmljaHQgZGVuIHRhdHPDpGNobGljaGVuIFdlcnQsIG11c3Mgbm9jaCDDvGJlcmFyYmVpdGV0IHdlcmRlbiwgZGVua2UgaWNoISEKTkFzIDwtIGMoIkNvbXBhbnkiLCAiQWdlbnQiKQpkYXRhRnJhbWUgJT4lCiAgbXV0YXRlX2F0KHZhcnMoTkFzKSwgfiBzdHJfcmVwbGFjZSguLCAiTlVMTCIsICJOQSIpKQoKCmBgYAoKCiMjIEF1ZmdhYmUgKDQgUHVua3RlKTogRXJzZXR6ZSBBYmvDvHJ6dW5nZW4KCkVyc2V0emUgKmdsZWljaHplaXRpZyogZsO8ciBkaWUgQXR0cmlidXRlICJNYXJrZXRTZWdtZW50IiB1bmQgIkRpc3RyaWJ1dGlvbkNoYW5uZWwiIGRpZSBBYmvDvHJ6dW5nZW4KCi0gIlRBIiBkdXJjaCAiVG91ciBBZ2VudCIsCi0gIlRPIiBkdXJjaCAiVG91ciBPcGVyYXRvciIuCgpIaW53ZWlzOiBWZXJ3ZW5kZSBmw7xyIGRlaW5lIEltcGxlbWVudGllcnVuZyBkaWUgRnVua3Rpb24gYGdzdWIoKWAgb2RlciDDhGhubGljaGVzLgoKCmBgYHtyfQojSGFiZSBpY2ggZ2VzY2hhZmZ0IGFiZXIgbGVpZGVyIG5pY2h0IG1pdCBkZXIgZ3N1YiBGdW5rdGlvbiwgZ2VybmUgRGVuaXMgcHJvYmllcmVuCgpgYGAKCgojIyBBdWZnYWJlICg0IFB1bmt0ZSk6IEVyc2V0emUgd2VpdGVyZSBBYmvDvHJ6dW5nZW4gCgpFcnNldHplIGbDvHIgZGFzIEF0dHJpYnV0ICJNZWFsIiBkaWUgdmVyd2VuZGV0ZW4gQWJrw7xyenVuZ2VuIAoKLSAiQkIiIGR1cmNoICJCZWQgJiBCcmVha2Zhc3QiLCAKLSAiSEIiIGR1cmNoICJIYWxmIGJvYXJkIiwKLSAiRkIiIGR1cmNoICJGdWxsIGJvYXJkIiwKLSAiVW5kZWZpbmVkIiBkdXJjaCAia2VpbiBQYWtldCIuCgpFcnNldHplIHdlaXRlciBmw7xyIGRpZSBBdHRyaWJ1dGUgIkJvb2tpbmdDYW5jZWxsZWQiIHVuZCAiSXNSZXBlYXRlZEd1ZXN0IiBkaWUgV2VydGUgMSBkdXJjaCAiWWVzIiB1bmQgMCBkdXJjaCAiTm8iLiAKCmBgYHtyfQpkYXRhRnJhbWUkTWVhbCA8LSBnc3ViKCJCQiIsICJCZWQgJiBCcmVha2Zhc3QiLAogICAgICAgICAgICAgICAgICBnc3ViKCJIQiIsICJIYWxmIGJvYXJkIiwKICAgICAgICAgICAgICAgICAgZ3N1YigiRkIiLCAiRnVsbCBib2FyZCIsCiAgICAgICAgICAgICAgICAgIGdzdWIoIlVuZGVmaW5lZCIsICJrZWluIFBha2V0IiwgZGF0YUZyYW1lJE1lYWwpKSkpCgpkYXRhRnJhbWUgPC0gZGF0YUZyYW1lICU+JSBtdXRhdGUoQm9va2luZ0NhbmNlbGxlZD1yZWNvZGUoQm9va2luZ0NhbmNlbGxlZCwgIjEiPSJZZXMiLCAiMCI9Ik5vIikpCmRhdGFGcmFtZSA8LSBkYXRhRnJhbWUgJT4lIG11dGF0ZShJc1JlcGVhdGVkR3Vlc3Q9cmVjb2RlKElzUmVwZWF0ZWRHdWVzdCwgIjEiPSJZZXMiLCAiMCI9Ik5vIikpCmBgYAoKCiMjIEF1ZmdhYmUgKDYgUHVua3RlKTogRXJzdGVsbGUgRGF0dW1zdmFyaWFibGVuIAoKRXJzdGVsbGUgRGF0dW1zdmFyaWFibGVuIGbDvHIgUmVzZXJ2YXRpb24gdW5kIEFua3VuZnQgYXVmZ3J1bmQgZGVyIEluZm9ybWF0aW9uZW4gIlJlc2VydmF0aW9uU3RhdHVzRGF0ZSIgYnp3LiAiQXJyaXZhbERhdGVZZWFyIiwgIkFycml2YWxEYXRlWWVhciIsICJBcnJpdmFsRGF0ZURheU9mTW9udGgiLgoKSGlud2VpczogVmVyd2VuZGUgZsO8ciBkZWluZSBJbXBsZW1lbnRpZXJ1bmcgZGllIGxpYnJhcnkgYGx1YnJpZGF0ZWAgdW5kIEluZm9ybWF0aW9uZW4gYXVzIFtSIGZvciBEYXRhIFNjaWVuY2UsIENoYXB0ZXIgIkRhdGVzIGFuZCB0aW1lcyJdKGh0dHBzOi8vcjRkcy5oYWQuY28ubnovZGF0ZXMtYW5kLXRpbWVzLmh0bWwpIHNvd2llIGRpZSBQb3N0cyBbVW1nYW5nIG1pdCBEYXR1bXNpbmZvcm1hdGlvbmVuXShodHRwczovL3NwYWNlcy50ZWNobmlrLmZobncuY2gvc3BhY2VzL2V4cGxvcmF0aXZlLWRhdGVuYW5hbHlzZS9iZWl0cmFlZ2UvdW1nYW5nLW1pdC1kYXR1bXNpbmZvcm1hdGlvbmVuKSB1bmQgW1VtZ2FuZyBtaXQgdGV4dHVlbGxlbiBEYXRlbiBtaXQgdGlkeXZlcnNlJ3Mgc3RyaW5ncl0oaHR0cHM6Ly9zcGFjZXMudGVjaG5pay5maG53LmNoL3NwYWNlcy9leHBsb3JhdGl2ZS1kYXRlbmFuYWx5c2UvYmVpdHJhZWdlL3VtZ2FuZy1taXQtdGV4dHVlbGxlbi1kYXRlbi1taXQtdGlkeXZlcnNlcy1zdHJpbmdyKS4KCmBgYHtyfQpsaWJyYXJ5KGx1YnJpZGF0ZSkKCiNEYXMgd8OkcmUgZWluIFZvcnNjaGxhZywgaWNoIHdlaXNzIGFiZXIgbmljaHQgb2IgZGllcyBzbyBvZGVyIGluIGVpbmVtIGFuZGVyZW4gRm9ybWF0IGdlZm9yZGVydCB3aXJkLgojZGF0YUZyYW1lRGF0ZXMgPC0gZGF0YUZyYW1lCiNkYXRhRnJhbWVEYXRlcyA8LSBjYmluZChkYXRhRnJhbWVEYXRlcywgQXJyaXZhbERhdGUgPSBtZHkoc3RyX2Moc3RyX2MoZGF0YUZyYW1lRGF0ZXMkQXJyaXZhbERhdGVNb250aCwgZGF0YUZyYW1lRGF0ZXMkQXJyaXZhbERhdGVEYXlPZk1vbnRoLCBzZXAgPSAiICIpLCAjZGF0YUZyYW1lRGF0ZXMkQXJyaXZhbERhdGVZZWFyLCBzZXAgPSAiLCAiKSkpCiNkYXRhRnJhbWVEYXRlcyA8LSBkYXRhRnJhbWVEYXRlc1tvcmRlcihkYXRhRnJhbWVEYXRlcyRBcnJpdmFsRGF0ZSksIF0KCgpgYGAKCgojIyBBdWZnYWJlICgzIFB1bmt0ZSk6IEJpbGRlIEZha3RvcmVuCgpLb252ZXJ0aWVyZSBzw6RtdGxpY2hlIGthdGVnb3JpYWxlbiBWYXJpYWJsZW4gdW5kIG1hY2hlIGRhcmF1cyBGYWt0b3JlbiB1bmQgw7xiZXJwcsO8ZmUgZGllIERhdGVudHlwZW4gZGVyIGtvbnZlcnRpZXJ0ZW4gVmFyaWFibGVuIGbDvHIgZGllIFZhcmlhYmxlbiAiQm9va2luZ0NhbmNlbGxlZCIgdW5kICJEZXBvc2l0VHlwZSIuCgpIaW53ZWlzOiBWZXJ3ZW5kZSBmw7xyIGRlaW5lIEltcGxlbWVudGllcnVuZyBgYWNyb3NzKClgIHVuZCBlaW5lIGJlc3RlaGVuZGUgUiBCYXNpcy1GdW5rdGlvbiB6dXIgUHLDvGZ1bmcgZGVyIGVyZm9sZ3JlaWNoZW4gQmlsZHVuZyBkZXIgRmFrdG9yZW4uCgpgYGB7cn0KI2thdGVnb3JpYWxlIFZhcmlhYmxlbjogTWVhbCxDb3VudHJ5LCBNYXJrZXRzZWdtZW50LCBEaXN0cmlidXRpb25zY2hhbm5lbCwgUmVzZXJ2ZWRSb29tVHlwZSwgQXNzaWduZWRSb29tVHlwZSwgRGVwb3NpdFR5cGUsIEFnZW50LCBDb21wYW55LCBDdXN0b21lcnR5cGUsIEF2ZXJhZ2UgRGFpbHkgUmF0ZS4KI0RpZXNlIGdpbHQgZXMgYWxzIGZhY3RvciBWYXJpYWJsZW4gZGFyenVzdGVsbGVuLCBoYWJlIGljaCBsZWlkZXIgbmljaCBnZXNjaGFmZnQuIERlbmlzIHByb2JpZXJlbi4KI0dpYnRzIGVzIG5vY2ggbWVociBrYXRlZ29yaWFsZSBWYXJpYWJsZW4/IAoKCgojw5xiZXJwcsO8ZmVuIG1pdCBSIEJhc2lzIEZ1bmt0aW9uCmNsYXNzKGRhdGFGcmFtZSRCb29raW5nQ2FuY2VsbGVkKQpjbGFzcyhkYXRhRnJhbWUkRGVwb3NpdFR5cGUpCmBgYAoKCiMjIEF1ZmdhYmUgKDcgUHVua3RlKTogRXJzdGVsbGUgbmV1ZSBWYXJpYWJsZW4gCgpFcnN0ZWxsZSBuZXVlIFZhcmlhYmxlbiwgd2VsY2hlIEF1c2t1bmZ0IGdlYmVuIMO8YmVyCgotIGRpZSBBbnphaGwgTG9naWVybsOkY2h0ZSBwcm8gQnVjaHVuZyAtPiBuZXVlIFZhcmlhYmxlICJUb3RhbE5pZ2h0cyIgYWxzIFN1bW1lIGRlciBBbnphaGwgTsOkY2h0ZSBhbiBXb2NoZW50YWdlbiAoIlN0YXlzSW5XZWVrTmlnaHRzKSB1bmQgV29jaGVuZW5kdGFnZW4gKCJTdGF5c0luV2Vla2VuZE5pZ2h0cyIpLCAKLSBkaWUgQW56YWhsIFBlcnNvbmVuIHBybyBCdWNodW5nIC0+IG5ldWUgVmFyaWFibGUgIkdyb3VwU2l6ZSIgYWxzIFN1bW1lIHZvbiAiQWR1bHRzIiwgIkNoaWxkcmVuIiB1bmQgIkJhYmllcyIsCi0gZGVuIGJlemFobHRlbiBQcmVpcyBwcm8gQXVmZW50aGFsdCAtPiBuZXVlIFZhcmlhYmxlICJQcmljZSIgZ2ViaWxkZXQgYWxzIFByb2R1a3Qgdm9uICJBdmVyYWdlRGFpbHlSYXRlIiB1bmQgIlRvdGFsTmlnaHRzIi4KCkVyc3RlbGxlIGRhcmF1cyBhYmdlbGVpdGV0IHdlaXRlcmUgQXR0cmlidXRlIGbDvHIgZGllIEFydCBkZXMgQXVmZW50aGFsdHMgKG5ldWUgRmFrdG9yLVZhcmlhYmxlICJTdGF5VHlwZSIpOgoKLSAiTG9uZyBzdGF5IiBkZWZpbmllcnQgYWxzIEF1ZmVudGhhbHQgdm9uIG1laHIgYWxzIDcgTsOkY2h0ZW4sCi0gIkZ1bGwgd2VlayIgZGVmaW5pZXJ0IGFscyBBdWZlbnRoYWx0IHZvbiA3IE7DpGNodGVuLAotICJXZWVrIHN0YXkiIGRlZmluaWVydCBhbHMgQXVmZW50aGFsdCB2b24gd2VuaWdlciBhbHMgNyBUYWdlbiBvaG5lIFdvY2hlbmVuZMO8YmVybmFjaHR1bmdlbiwKLSAiV2Vla2VuZCBvbmx5IiBkZWZpbmllcnQgYWxzIGVpbnTDpGdpZ2VyIEF1ZmVudGhhbHQgbWl0IGVpbmVyIFdvY2hlbmVuZMO8YmVybmFjaHR1bmcsCi0gIkxvbmcgd2Vla2VuZCIgZGVmaW5pZXJ0IGFscyB6d2VpdMOkZ2lnZXIgQXVmZW50aGFsdCBtaXQgendlaSBXb2NoZW5lbmTDvGJlcm5hY2h0dW5nZW4sCgpzb3dpZSBkZW4gSGF1c2hhbHRzdHlwIChuZXVlIEZha3Rvci1WYXJpYWJsZSAiSG91c2Vob2xkVHlwZSIpOgoKLSAiU2luZ2xlIiBkZWZpbmllcnQgYWxzIEJ1Y2h1bmcgZsO8ciBnZW5hdSBlaW5lIEVyd2FjaHNlbmUsCi0gIkNvdXBsZSIgZGVmaW5pZXJ0IGFscyBCdWNodW5nIGbDvHIgZ2VuYXUgendlaSBFcndhY2hzZW5lLAotICJTaW5nbGUgUGFyZW50IiBkZWZpbmllcnQgYWxzIEJ1Y2h1bmcgZsO8ciBlaW5lIEVyd2FjaHNlbmUgdW5kIGVpbiBvZGVyIG1laHJlcmUgS2luZGVyIG9kZXIgQmFiaWVzLAotICJGYW1pbHkiIGRlZmluaWVydCBhbHMgQnVjaHVuZyBmw7xyIHp3ZWkgRXJ3YWNoc2VuZSB1bmQgZWluIG9kZXIgbWVocmVyZSBLaW5kZXIgb2RlciBCYWJpZXMsCi0gIkdyb3VwIiBkZWZpbmllcnQgYWxzIEJ1Y2h1bmcgZsO8ciBtZWhyIGFscyB6d2VpIEVyd2FjaHNlbmUgKG1pdCBvZGVyIG9obmUgS2luZGVyIC8gQmFiaWVzKSwKCmBgYHtyfQojVG90YWxOaWdodHMgVmFyaWFibGUgZXJzdGVsbGVuCmRhdGFGcmFtZSRUb3RhbE5pZ2h0cyA8LSBkYXRhRnJhbWUkU3RheXNJbldlZWtOaWdodHMgKyBkYXRhRnJhbWUkU3RheXNJbldlZWtlbmROaWdodHMKI0dyb3VwU2l6ZSBWYXJpYWJsZSBlcnN0ZWxsZW4KZGF0YUZyYW1lJEdyb3VwU2l6ZSA8LSBkYXRhRnJhbWUkQWR1bHRzICsgZGF0YUZyYW1lJENoaWxkcmVuICsgZGF0YUZyYW1lJEJhYmllcwojUHJpY2UgVmFyaWFibGUgZXJzdGVsbGVuCmRhdGFGcmFtZSRQcmljZSA8LSBkYXRhRnJhbWUkQXZlcmFnZURhaWx5UmF0ZSAqIGRhdGFGcmFtZSRUb3RhbE5pZ2h0cwoKI1N0YXlUeXBlIFZhcmlhYmxlIGVyc3RlbGxlbgpkYXRhRnJhbWUgJT4lCiAgbXV0YXRlKFN0YXlUeXBlID0gY2FzZV93aGVuKFRvdGFsTmlnaHRzID4gNyB+ICJMb25nIFN0YXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb3RhbE5pZ2h0cyA9PSA3IH4gIkZ1bGwgd2VlayIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXlzSW5XZWVrTmlnaHRzIDwgNyAmIFN0YXlzSW5XZWVrZW5kTmlnaHRzID09IDAgfiAiV2VlayBTdGF5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG90YWxOaWdodHMgPT0gMSAmIFN0YXlzSW5XZWVrZW5kTmlnaHRzID09IDEgfiAiV2Vla2VuZCBvbmx5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RheXNJbldlZWtOaWdodHMgPT0gMCAmIFN0YXlzSW5XZWVrZW5kTmlnaHRzID09IDIgfiAiTG9uZyBXZWVrZW5kIikpCgojSG91c2Vob2xkVHlwZSBWYXJpYWJsZSBlcnN0ZWxsZW4gICAgIGFkdWx0cywgY2hpbGRyZW4sIGJhYmllcwpkYXRhRnJhbWUgJT4lCiAgbXV0YXRlKEhvdXNlaG9sZFR5cGUgPSBjYXNlX3doZW4oQWR1bHRzID09IDEgJiBDaGlsZHJlbiA9PSAwICYgQmFiaWVzID09IDAgfiAiU2luZ2xlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZHVsdHMgPT0gMiAmIENoaWxkcmVuID09IDAgJiBCYWJpZXMgPT0gMCB+ICJDb3VwbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkdWx0cyA9PSAxICYgQ2hpbGRyZW4gPj0gMCAmIEJhYmllcyA+PSAwIH4gIlNpbmdsZSBQYXJlbnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkdWx0cyA9PSAyICYgQ2hpbGRyZW4gPj0gMCAmIEJhYmllcyA+PSAwIH4gIkZhbWlseSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWR1bHRzID4gIDIgJiBDaGlsZHJlbiA+PSAwICYgQmFiaWVzID49IDAgfiAiR3JvdXAiKSkKYGBgCgoKIyBTdW1tYXJpc2NoZSBTdGF0aXN0aWtlbiBlcnpldWdlbgoKIyMgQXVmZ2FiZSAoMyBQdW5rdGUpOiBFcnN0ZWxsZSBIw6R1Zmlna2VpdHN0YWJlbGxlbgoKR2liIGbDvHIgZGllIGJlaWRlbiBvYmVuIGJlYXJiZWl0ZXRlbiBBdHRyaWJ1dGUgIk1hcmtldFNlZ21lbnQiIHVuZCAiRGlzdHJpYnV0aW9uQ2hhbm5lbCIgamUgZWluZSBzZXBhcmF0ZSBIw6R1Zmlna2VpdHN0YWJlbGxlIGF1cy4KCkhpbndlaXM6IFZlcndlbmRlIGbDvHIgZGVpbmUgSW1wbGVtZW50aWVydW5nIG51ciAqKmVpbmVuKiogQXVmcnVmIGRlciBGdW5rdGlvbiBgc3VtbWFyeSgpYC4KCmBgYHtyfQpjbGVhbmVkTGlzdCA8LSBkYXRhRnJhbWUKI01hcmtldHNlZ21lbnQKZnJlcVRhYmxlTWFya2V0U2VnbWVudCA8LSBjbGVhbmVkTGlzdCAlPiUgZ3JvdXBfYnkoTWFya2V0c2VnbWVudCA9IGNsZWFuZWRMaXN0JE1hcmtldFNlZ21lbnQpICU+JSBzdW1tYXJpc2UoQ291bnQgPSBuKCkpCmZyZXFUYWJsZU1hcmtldFNlZ21lbnQgPC0gZnJlcVRhYmxlTWFya2V0U2VnbWVudFtvcmRlcihmcmVxVGFibGVNYXJrZXRTZWdtZW50JENvdW50LCBkZWNyZWFzaW5nID0gVFJVRSksXQp0b3RhbFNlZ21lbnRzIDwtIHN1bShmcmVxVGFibGVNYXJrZXRTZWdtZW50JENvdW50KQpmcmVxVGFibGVNYXJrZXRTZWdtZW50IDwtIGNiaW5kKGZyZXFUYWJsZU1hcmtldFNlZ21lbnQsIFBlcmNlbnRhZ2UgPSBmcmVxVGFibGVNYXJrZXRTZWdtZW50JENvdW50L3RvdGFsU2VnbWVudHMgKiAxMDApCgojRGlzdHJpYnV0aW9uQ2hhbm5lbApmcmVxVGFibGVEaXN0cmlidXRpb25DaGFubmVsIDwtIGNsZWFuZWRMaXN0ICU+JSBncm91cF9ieShEaXN0cmlidXRpb25DaGFubmVsID0gY2xlYW5lZExpc3QkRGlzdHJpYnV0aW9uQ2hhbm5lbCkgJT4lIHN1bW1hcmlzZShDb3VudCA9IG4oKSkKZnJlcVRhYmxlRGlzdHJpYnV0aW9uQ2hhbm5lbCA8LSBmcmVxVGFibGVEaXN0cmlidXRpb25DaGFubmVsW29yZGVyKGZyZXFUYWJsZURpc3RyaWJ1dGlvbkNoYW5uZWwkQ291bnQsIGRlY3JlYXNpbmcgPSBUUlVFKSxdCnRvdGFsU2VnbWVudHMgPC0gc3VtKGZyZXFUYWJsZURpc3RyaWJ1dGlvbkNoYW5uZWwkQ291bnQpCmZyZXFUYWJsZURpc3RyaWJ1dGlvbkNoYW5uZWwgPC0gY2JpbmQoZnJlcVRhYmxlRGlzdHJpYnV0aW9uQ2hhbm5lbCwgUGVyY2VudGFnZSA9IGZyZXFUYWJsZURpc3RyaWJ1dGlvbkNoYW5uZWwkQ291bnQvdG90YWxTZWdtZW50cyAqIDEwMCkKCgpgYGAKCgojIyBBdWZnYWJlICgzIFB1bmt0ZSk6IEVyc3RlbGxlIHdlaXRlcmUgSMOkdWZpZ2tlaXRzdGFiZWxsZW4KCkdpYiBmw7xyIGRpZSBBdHRyaWJ1dGUgIk1lYWwiIHVuZCAiSXNSZXBlYXRlZEd1ZXN0IiBzZXBhcmF0IHRhYmVsbGFyaXNjaGUgSMOkdWZpZ2tlaXRzdmVydGVpbHVuZ2VuIGF1cy4KCkhpbndlaXM6IFZlcndlbmRlIGbDvHIgZGVpbmUgSW1wbGVtZW50aWVydW5nIGRpZSBGdW5rdGlvbiBga2FibGUoKWAuCgpgYGB7cn0KI01lYWxzCmZyZXFUYWJsZU1lYWwgPC0gY2xlYW5lZExpc3QgJT4lIGdyb3VwX2J5KE1lYWwgPSBjbGVhbmVkTGlzdCRNZWFsKSAlPiUgc3VtbWFyaXNlKENvdW50ID0gbigpKQpmcmVxVGFibGVNZWFsIDwtIGZyZXFUYWJsZU1lYWxbb3JkZXIoZnJlcVRhYmxlTWVhbCRDb3VudCwgZGVjcmVhc2luZyA9IFRSVUUpLF0KdG90YWxTZWdtZW50cyA8LSBzdW0oZnJlcVRhYmxlTWVhbCRDb3VudCkKZnJlcVRhYmxlTWVhbCA8LSBjYmluZChmcmVxVGFibGVNZWFsLCBQZXJjZW50YWdlID0gZnJlcVRhYmxlTWVhbCRDb3VudC90b3RhbFNlZ21lbnRzICogMTAwKQprYWJsZShmcmVxVGFibGVNZWFsLCBkaWdpdHMgPSAyLCBmb3JtYXQgPSAicGlwZSIpCgojSXNSZXBlYXRlZEd1ZXN0CmZyZXFUYWJsZUlzUmVwZWF0ZWRHdWVzdCA8LSBjbGVhbmVkTGlzdCAlPiUgZ3JvdXBfYnkoTWVhbCA9IGNsZWFuZWRMaXN0JElzUmVwZWF0ZWRHdWVzdCkgJT4lIHN1bW1hcmlzZShDb3VudCA9IG4oKSkKZnJlcVRhYmxlSXNSZXBlYXRlZEd1ZXN0IDwtIGZyZXFUYWJsZUlzUmVwZWF0ZWRHdWVzdFtvcmRlcihmcmVxVGFibGVJc1JlcGVhdGVkR3Vlc3QkQ291bnQsIGRlY3JlYXNpbmcgPSBUUlVFKSxdCnRvdGFsU2VnbWVudHMgPC0gc3VtKGZyZXFUYWJsZUlzUmVwZWF0ZWRHdWVzdCRDb3VudCkKZnJlcVRhYmxlSXNSZXBlYXRlZEd1ZXN0IDwtIGNiaW5kKGZyZXFUYWJsZUlzUmVwZWF0ZWRHdWVzdCwgUGVyY2VudGFnZSA9IGZyZXFUYWJsZUlzUmVwZWF0ZWRHdWVzdCRDb3VudC90b3RhbFNlZ21lbnRzICogMTAwKQprYWJsZShmcmVxVGFibGVJc1JlcGVhdGVkR3Vlc3QsIGRpZ2l0cyA9IDIsIGZvcm1hdCA9ICJwaXBlIikKCmBgYAoKCiMjIEF1ZmdhYmUgKDUgUHVua3RlKTogRXJzdGVsbGUgd2VpdGVyZSBIw6R1Zmlna2VpdHN0YWJlbGxlbgoKRXJzdGVsbGUgZWluZSBzdW1tYXJpc2NoZSwgdW5pdmFyaWF0ZSBTdGF0aXN0aWsgZsO8ciBhbGxlIEF0dHJpYnV0ZSB1bmQgZG9rdW1lbnRpZXJlIGt1cnogYWxsZsOkbGxpZ2UgQmVzb25kZXJoZWl0ZW4uCgpgYGB7ciBjb2xsYXBzZT1UUlVFfQojQm9va2luZ0NhbmNlbGxlZApmcmVxVGFibGVCb29raW5nQ2FuY2VsbGVkIDwtIGNsZWFuZWRMaXN0ICU+JSBncm91cF9ieShCb29raW5nQ2FuY2VsbGVkID0gY2xlYW5lZExpc3QkQm9va2luZ0NhbmNlbGxlZCkgJT4lIHN1bW1hcmlzZShDb3VudCA9IG4oKSkKZnJlcVRhYmxlQm9va2luZ0NhbmNlbGxlZCA8LSBmcmVxVGFibGVCb29raW5nQ2FuY2VsbGVkW29yZGVyKGZyZXFUYWJsZUJvb2tpbmdDYW5jZWxsZWQkQ291bnQsIGRlY3JlYXNpbmcgPSBUUlVFKSxdCnRvdGFsU2VnbWVudHMgPC0gc3VtKGZyZXFUYWJsZUJvb2tpbmdDYW5jZWxsZWQkQ291bnQpCmZyZXFUYWJsZUJvb2tpbmdDYW5jZWxsZWQgPC0gY2JpbmQoZnJlcVRhYmxlQm9va2luZ0NhbmNlbGxlZCwgUGVyY2VudGFnZSA9IGZyZXFUYWJsZUJvb2tpbmdDYW5jZWxsZWQkQ291bnQvdG90YWxTZWdtZW50cyAqIDEwMCkKa2FibGUoZnJlcVRhYmxlQm9va2luZ0NhbmNlbGxlZCwgZGlnaXRzID0gMiwgZm9ybWF0ID0gInBpcGUiKQpgYGAKCmBgYHtyIGNvbGxhcHNlPVRSVUV9CiNMZWFkVGltZQpmcmVxVGFibGVMZWFkVGltZSA8LSBjbGVhbmVkTGlzdCAlPiUgZ3JvdXBfYnkoTGVhZFRpbWUgPSBjbGVhbmVkTGlzdCRMZWFkVGltZSkgJT4lIHN1bW1hcmlzZShDb3VudCA9IG4oKSkKZnJlcVRhYmxlTGVhZFRpbWUgPC0gZnJlcVRhYmxlTGVhZFRpbWVbb3JkZXIoZnJlcVRhYmxlTGVhZFRpbWUkQ291bnQsIGRlY3JlYXNpbmcgPSBUUlVFKSxdCnRvdGFsU2VnbWVudHMgPC0gc3VtKGZyZXFUYWJsZUxlYWRUaW1lJENvdW50KQpmcmVxVGFibGVMZWFkVGltZSA8LSBjYmluZChmcmVxVGFibGVMZWFkVGltZSwgUGVyY2VudGFnZSA9IGZyZXFUYWJsZUxlYWRUaW1lJENvdW50L3RvdGFsU2VnbWVudHMgKiAxMDApCmthYmxlKGZyZXFUYWJsZUxlYWRUaW1lLCBkaWdpdHMgPSAyLCBmb3JtYXQgPSAicGlwZSIpCmBgYApFcmtlbm50bmlzczoKRXJzdGF1bmRsaWNoIHZpZWxlIGt1cnpmcmlzdGlnZSBCdWNodW5nZW4uCgpgYGB7ciBjb2xsYXBzZT1UUlVFfQojQ291bnRyeQpmcmVxVGFibGVDb3VudHJ5IDwtIGNsZWFuZWRMaXN0ICU+JSBncm91cF9ieShDb3VudHJ5ID0gY2xlYW5lZExpc3QkQ291bnRyeSkgJT4lIHN1bW1hcmlzZShDb3VudCA9IG4oKSkKZnJlcVRhYmxlQ291bnRyeSA8LSBmcmVxVGFibGVDb3VudHJ5W29yZGVyKGZyZXFUYWJsZUNvdW50cnkkQ291bnQsIGRlY3JlYXNpbmcgPSBUUlVFKSxdCnRvdGFsU2VnbWVudHMgPC0gc3VtKGZyZXFUYWJsZUNvdW50cnkkQ291bnQpCmZyZXFUYWJsZUNvdW50cnkgPC0gY2JpbmQoZnJlcVRhYmxlQ291bnRyeSwgUGVyY2VudGFnZSA9IGZyZXFUYWJsZUNvdW50cnkkQ291bnQvdG90YWxTZWdtZW50cyAqIDEwMCkKa2FibGUoZnJlcVRhYmxlQ291bnRyeSwgZGlnaXRzID0gMiwgZm9ybWF0ID0gInBpcGUiKQpgYGAKRXJrZW5udG5pc3M6ClZpZWxlIEJlc3VjaGVyIHZvbiBQb3J0dWdhbC4KCgpgYGB7ciBjb2xsYXBzZT1UUlVFfQojQm9va2luZ0NoYW5nZXMKZnJlcVRhYmxlQm9va2luZ0NoYW5nZXMgPC0gY2xlYW5lZExpc3QgJT4lIGdyb3VwX2J5KEJvb2tpbmdDaGFuZ2VzID0gY2xlYW5lZExpc3QkQm9va2luZ0NoYW5nZXMpICU+JSBzdW1tYXJpc2UoQ291bnQgPSBuKCkpCmZyZXFUYWJsZUJvb2tpbmdDaGFuZ2VzIDwtIGZyZXFUYWJsZUJvb2tpbmdDaGFuZ2VzW29yZGVyKGZyZXFUYWJsZUJvb2tpbmdDaGFuZ2VzJENvdW50LCBkZWNyZWFzaW5nID0gVFJVRSksXQp0b3RhbFNlZ21lbnRzIDwtIHN1bShmcmVxVGFibGVCb29raW5nQ2hhbmdlcyRDb3VudCkKZnJlcVRhYmxlQm9va2luZ0NoYW5nZXMgPC0gY2JpbmQoZnJlcVRhYmxlQm9va2luZ0NoYW5nZXMsIFBlcmNlbnRhZ2UgPSBmcmVxVGFibGVCb29raW5nQ2hhbmdlcyRDb3VudC90b3RhbFNlZ21lbnRzICogMTAwKQprYWJsZShmcmVxVGFibGVCb29raW5nQ2hhbmdlcywgZGlnaXRzID0gMiwgZm9ybWF0ID0gInBpcGUiKQpgYGAKRXJrZW5udG5pc3M6CktlaW5lIGF1c2Vyb3JkZW50bGljaGUgRXJrZW5udG5pc3MKCmBgYHtyIGNvbGxhcHNlPVRSVUV9CiNEZXBvc2l0VHlwZQpmcmVxVGFibGVEZXBvc2l0VHlwZSA8LSBjbGVhbmVkTGlzdCAlPiUgZ3JvdXBfYnkoRGVwb3NpdFR5cGUgPSBjbGVhbmVkTGlzdCREZXBvc2l0VHlwZSkgJT4lIHN1bW1hcmlzZShDb3VudCA9IG4oKSkKZnJlcVRhYmxlRGVwb3NpdFR5cGUgPC0gZnJlcVRhYmxlRGVwb3NpdFR5cGVbb3JkZXIoZnJlcVRhYmxlRGVwb3NpdFR5cGUkQ291bnQsIGRlY3JlYXNpbmcgPSBUUlVFKSxdCnRvdGFsU2VnbWVudHMgPC0gc3VtKGZyZXFUYWJsZURlcG9zaXRUeXBlJENvdW50KQpmcmVxVGFibGVEZXBvc2l0VHlwZSA8LSBjYmluZChmcmVxVGFibGVEZXBvc2l0VHlwZSwgUGVyY2VudGFnZSA9IGZyZXFUYWJsZURlcG9zaXRUeXBlJENvdW50L3RvdGFsU2VnbWVudHMgKiAxMDApCmthYmxlKGZyZXFUYWJsZURlcG9zaXRUeXBlLCBkaWdpdHMgPSAyLCBmb3JtYXQgPSAicGlwZSIpCmBgYApFcmtlbm50bmlzczoKSGF1cHRzw6RjaGxpY2gga2VpbiBEZXBvdCBoaW50ZXJsZWd0LgoKYGBge3IgY29sbGFwc2U9VFJVRX0KI0N1c3RvbWVyVHlwZQpmcmVxVGFibGVDdXN0b21lclR5cGUgPC0gY2xlYW5lZExpc3QgJT4lIGdyb3VwX2J5KEN1c3RvbWVyVHlwZSA9IGNsZWFuZWRMaXN0JEN1c3RvbWVyVHlwZSkgJT4lIHN1bW1hcmlzZShDb3VudCA9IG4oKSkKZnJlcVRhYmxlQ3VzdG9tZXJUeXBlIDwtIGZyZXFUYWJsZUN1c3RvbWVyVHlwZVtvcmRlcihmcmVxVGFibGVDdXN0b21lclR5cGUkQ291bnQsIGRlY3JlYXNpbmcgPSBUUlVFKSxdCnRvdGFsU2VnbWVudHMgPC0gc3VtKGZyZXFUYWJsZUN1c3RvbWVyVHlwZSRDb3VudCkKZnJlcVRhYmxlQ3VzdG9tZXJUeXBlIDwtIGNiaW5kKGZyZXFUYWJsZUN1c3RvbWVyVHlwZSwgUGVyY2VudGFnZSA9IGZyZXFUYWJsZUN1c3RvbWVyVHlwZSRDb3VudC90b3RhbFNlZ21lbnRzICogMTAwKQprYWJsZShmcmVxVGFibGVDdXN0b21lclR5cGUsIGRpZ2l0cyA9IDIsIGZvcm1hdCA9ICJwaXBlIikKYGBgCkVya2VubnRuaXNzOgpLZWluZSBzcGV6aWVsbGVuIEVya2VubnRuaXNzZS4KCmBgYHtyIGNvbGxhcHNlPVRSVUV9CiNSZXF1aXJlZENhclBhcmtpbmdTcGFjZXMKZnJlcVRhYmxlUmVxdWlyZWRDYXJQYXJraW5nU3BhY2VzIDwtIGNsZWFuZWRMaXN0ICU+JSBncm91cF9ieShSZXF1aXJlZENhclBhcmtpbmdTcGFjZXMgPSBjbGVhbmVkTGlzdCRSZXF1aXJlZENhclBhcmtpbmdTcGFjZXMpICU+JSBzdW1tYXJpc2UoQ291bnQgPSBuKCkpCmZyZXFUYWJsZVJlcXVpcmVkQ2FyUGFya2luZ1NwYWNlcyA8LSBmcmVxVGFibGVSZXF1aXJlZENhclBhcmtpbmdTcGFjZXNbb3JkZXIoZnJlcVRhYmxlUmVxdWlyZWRDYXJQYXJraW5nU3BhY2VzJENvdW50LCBkZWNyZWFzaW5nID0gVFJVRSksXQp0b3RhbFNlZ21lbnRzIDwtIHN1bShmcmVxVGFibGVSZXF1aXJlZENhclBhcmtpbmdTcGFjZXMkQ291bnQpCmZyZXFUYWJsZVJlcXVpcmVkQ2FyUGFya2luZ1NwYWNlcyA8LSBjYmluZChmcmVxVGFibGVSZXF1aXJlZENhclBhcmtpbmdTcGFjZXMsIFBlcmNlbnRhZ2UgPSBmcmVxVGFibGVSZXF1aXJlZENhclBhcmtpbmdTcGFjZXMkQ291bnQvdG90YWxTZWdtZW50cyAqIDEwMCkKa2FibGUoZnJlcVRhYmxlUmVxdWlyZWRDYXJQYXJraW5nU3BhY2VzLCBkaWdpdHMgPSAyLCBmb3JtYXQgPSAicGlwZSIpCmBgYApFcmtlbm50bmlzczoKRGllIE1laHJoZWl0IGtvbW10IG9obmUgQXV0by4KCgpgYGB7ciBjb2xsYXBzZT1UUlVFfQojUmVzZXJ2YXRpb25TdGF0dXMKZnJlcVRhYmxlUmVzZXJ2YXRpb25TdGF0dXMgPC0gY2xlYW5lZExpc3QgJT4lIGdyb3VwX2J5KFJlc2VydmF0aW9uU3RhdHVzID0gY2xlYW5lZExpc3QkUmVzZXJ2YXRpb25TdGF0dXMpICU+JSBzdW1tYXJpc2UoQ291bnQgPSBuKCkpCmZyZXFUYWJsZVJlc2VydmF0aW9uU3RhdHVzIDwtIGZyZXFUYWJsZVJlc2VydmF0aW9uU3RhdHVzW29yZGVyKGZyZXFUYWJsZVJlc2VydmF0aW9uU3RhdHVzJENvdW50LCBkZWNyZWFzaW5nID0gVFJVRSksXQp0b3RhbFNlZ21lbnRzIDwtIHN1bShmcmVxVGFibGVSZXNlcnZhdGlvblN0YXR1cyRDb3VudCkKZnJlcVRhYmxlUmVzZXJ2YXRpb25TdGF0dXMgPC0gY2JpbmQoZnJlcVRhYmxlUmVzZXJ2YXRpb25TdGF0dXMsIFBlcmNlbnRhZ2UgPSBmcmVxVGFibGVSZXNlcnZhdGlvblN0YXR1cyRDb3VudC90b3RhbFNlZ21lbnRzICogMTAwKQprYWJsZShmcmVxVGFibGVSZXNlcnZhdGlvblN0YXR1cywgZGlnaXRzID0gMiwgZm9ybWF0ID0gInBpcGUiKQpgYGAKRXJrZW5udG5pc3M6CktlaW5lIHNwZXppZWxsZW4gRXJrZW5udG5pc3NlLgoKYGBge3IgY29sbGFwc2U9VFJVRX0KI0NvbXBhbnkKZnJlcVRhYmxlQ29tcGFueSA8LSBjbGVhbmVkTGlzdCAlPiUgZ3JvdXBfYnkoQ29tcGFueSA9IGNsZWFuZWRMaXN0JENvbXBhbnkpICU+JSBzdW1tYXJpc2UoQ291bnQgPSBuKCkpCmZyZXFUYWJsZUNvbXBhbnkgPC0gZnJlcVRhYmxlQ29tcGFueVtvcmRlcihmcmVxVGFibGVDb21wYW55JENvdW50LCBkZWNyZWFzaW5nID0gVFJVRSksXQp0b3RhbFNlZ21lbnRzIDwtIHN1bShmcmVxVGFibGVDb21wYW55JENvdW50KQpmcmVxVGFibGVDb21wYW55IDwtIGNiaW5kKGZyZXFUYWJsZUNvbXBhbnksIFBlcmNlbnRhZ2UgPSBmcmVxVGFibGVDb21wYW55JENvdW50L3RvdGFsU2VnbWVudHMgKiAxMDApCmthYmxlKGZyZXFUYWJsZUNvbXBhbnksIGRpZ2l0cyA9IDIsIGZvcm1hdCA9ICJwaXBlIikKYGBgCkVya2VubnRuaXNzOgpEaWUgRmlybWEgMjIzIGlzdCBlaW4gZ3Jvc3NlciBLdW5kZS4KCmBgYHtyIGNvbGxhcHNlPVRSVUV9CiNBZ2VudApmcmVxVGFibGVBZ2VudCA8LSBjbGVhbmVkTGlzdCAlPiUgZ3JvdXBfYnkoQWdlbnQgPSBjbGVhbmVkTGlzdCRBZ2VudCkgJT4lIHN1bW1hcmlzZShDb3VudCA9IG4oKSkKZnJlcVRhYmxlQWdlbnQgPC0gZnJlcVRhYmxlQWdlbnRbb3JkZXIoZnJlcVRhYmxlQWdlbnQkQ291bnQsIGRlY3JlYXNpbmcgPSBUUlVFKSxdCnRvdGFsU2VnbWVudHMgPC0gc3VtKGZyZXFUYWJsZUFnZW50JENvdW50KQpmcmVxVGFibGVBZ2VudCA8LSBjYmluZChmcmVxVGFibGVBZ2VudCwgUGVyY2VudGFnZSA9IGZyZXFUYWJsZUFnZW50JENvdW50L3RvdGFsU2VnbWVudHMgKiAxMDApCmthYmxlKGZyZXFUYWJsZUFnZW50LCBkaWdpdHMgPSAyLCBmb3JtYXQgPSAicGlwZSIpCmBgYApFcmtlbm50bmlzczoKRGVyIEFnZW50IDI0MCBiZXTDpHRpZ3Qgw7xiZXIgZWluIGRyaXR0ZWwgZGVyIFJlc2VydmF0aW9uZW4uCgoKYGBge3IgY29sbGFwc2U9VFJVRX0KI0Fycml2YWxEYXRlWWVhcgpmcmVxVGFibGVBcnJpdmFsRGF0ZVllYXIgPC0gY2xlYW5lZExpc3QgJT4lIGdyb3VwX2J5KEFycml2YWxEYXRlWWVhciA9IGNsZWFuZWRMaXN0JEFycml2YWxEYXRlWWVhcikgJT4lIHN1bW1hcmlzZShDb3VudCA9IG4oKSkKZnJlcVRhYmxlQXJyaXZhbERhdGVZZWFyIDwtIGZyZXFUYWJsZUFycml2YWxEYXRlWWVhcltvcmRlcihmcmVxVGFibGVBcnJpdmFsRGF0ZVllYXIkQ291bnQsIGRlY3JlYXNpbmcgPSBUUlVFKSxdCnRvdGFsU2VnbWVudHMgPC0gc3VtKGZyZXFUYWJsZUFycml2YWxEYXRlWWVhciRDb3VudCkKZnJlcVRhYmxlQXJyaXZhbERhdGVZZWFyIDwtIGNiaW5kKGZyZXFUYWJsZUFycml2YWxEYXRlWWVhciwgUGVyY2VudGFnZSA9IGZyZXFUYWJsZUFycml2YWxEYXRlWWVhciRDb3VudC90b3RhbFNlZ21lbnRzICogMTAwKQprYWJsZShmcmVxVGFibGVBcnJpdmFsRGF0ZVllYXIsIGRpZ2l0cyA9IDIsIGZvcm1hdCA9ICJwaXBlIikKYGBgCkVya2VubnRuaXNzOgpEaWUgRGF0ZW4gZW50aGFsdGVuIG1pdCBncm9zc2VyIFdhaHJzY2hlaW5kbGljaGtlaXQgbnVyIFRlaWxkYXRlbiBkZXIgSmFocmUgMjAxNSB1bmQgMjAxNy4KCgoKCgoKCgoKCiMjIEF1ZmdhYmUgKDQgUHVua3RlKTogUHLDvGZlIEF1ZmbDpGxsaWdrZWl0ZW4KCkVyc3RlbGxlIGVpbmUgdGFiZWxsYXJpc2NoZSBIw6R1Zmlna2VpdHN2ZXJ0ZWlsdW5nIGbDvHIgZGFzIG5ldSBnZWJpbGRldGUgQXR0cmlidXQgIkhvdXNlaG9sZFR5cGUiIHVuZCB1bnRlcnN1Y2hlIHVuZCBiZXNjaHJlaWJlIEF1ZmbDpGxsaWdrZWl0ZW4uCgpIaW53ZWlzOiBWZXJ3ZW5kZSBmw7xyIGRlaW5lIEltcGxlbWVudGllcnVuZyBkaWUgRnVua3Rpb24gYGthYmxlKClgLgoKYGBge3J9CiNFcnN0IG3DtmdsaWNoIHdlbm4gZGllIEF1ZmdhYmUgNC45IGFiZ2VzY2hsb3NzZW4gaXN0CiNIb3VzZWhvbGRUeXBlIAojZnJlcVRhYmxlSG91c2Vob2xkVHlwZSA8LSBjbGVhbmVkTGlzdCAlPiUgZ3JvdXBfYnkoSG91c2Vob2xkVHlwZSA9IGNsZWFuZWRMaXN0JEN1c3RvbWVyVHlwZSkgJT4lIHN1bW1hcmlzZShDb3VudCA9IG4oKSkKI2ZyZXFUYWJsZUhvdXNlaG9sZFR5cGUgPC0gZnJlcVRhYmxlSG91c2Vob2xkVHlwZVtvcmRlcihmcmVxVGFibGVIb3VzZWhvbGRUeXBlJENvdW50LCBkZWNyZWFzaW5nID0gVFJVRSksXQojdG90YWxTZWdtZW50cyA8LSBzdW0oZnJlcVRhYmxlSG91c2Vob2xkVHlwZSRDb3VudCkKI2ZyZXFUYWJsZUhvdXNlaG9sZFR5cGUgPC0gY2JpbmQoZnJlcVRhYmxlSG91c2Vob2xkVHlwZSwgUGVyY2VudGFnZSA9IGZyZXFUYWJsZUhvdXNlaG9sZFR5cGUkQ291bnQvdG90YWxTZWdtZW50cyAqIDEwMCkKI2thYmxlKGZyZXFUYWJsZUhvdXNlaG9sZFR5cGUsIGRpZ2l0cyA9IDIsIGZvcm1hdCA9ICJwaXBlIikKYGBgCgoKIyMgQXVmZ2FiZSAoMyBQdW5rdGUpOiBQcsO8ZmUgd2VpdGVyZSBBdWZmw6RsbGlna2VpdGVuCgpFcnN0ZWxsZSBlaW5lIFN0YXRpc3RpayBmw7xyIGRhcyBBdHRyaWJ1dCAiQXZlcmFnZURhaWx5UmF0ZSIgdW5kIGlkZW50aWZpemllcmUgQXVmZsOkbGxpZ2tlaXRlbi4KCmBgYHtyfQpkYXRhRnJhbWVEYXRlcyA8LSBkYXRhRnJhbWUKZGF0YUZyYW1lRGF0ZXMgPC0gY2JpbmQoZGF0YUZyYW1lRGF0ZXMsIEFycml2YWxEYXRlID0gbWR5KHN0cl9jKHN0cl9jKGRhdGFGcmFtZURhdGVzJEFycml2YWxEYXRlTW9udGgsIGRhdGFGcmFtZURhdGVzJEFycml2YWxEYXRlRGF5T2ZNb250aCwgc2VwID0gIiAiKSwgZGF0YUZyYW1lRGF0ZXMkQXJyaXZhbERhdGVZZWFyLCBzZXAgPSAiLCAiKSkpCmRhdGFGcmFtZURhdGVzIDwtIGRhdGFGcmFtZURhdGVzW29yZGVyKGRhdGFGcmFtZURhdGVzJEFycml2YWxEYXRlKSwgXQpwbG90KGRhdGFGcmFtZURhdGVzJEF2ZXJhZ2VEYWlseVJhdGUpCmdncGxvdChkYXRhRnJhbWVEYXRlcywgYWVzKHggPSBkYXRhRnJhbWVEYXRlcyRBcnJpdmFsRGF0ZSwgeSA9IGRhdGFGcmFtZURhdGVzJEF2ZXJhZ2VEYWlseVJhdGUpKStnZW9tX3BvaW50KCkrZ2VvbV9zbW9vdGgoKQoKCgpgYGAKSWRlbnRpZml6aWVydGUgQXVmZsOkbGxpZ2tlaXRlbjoKSW0gU29tbWVyIHdlcmRlbiBow7ZoZXJlIFByZWlzZSBnZXphaGx0LgpTcGV6aWVsbGUgVGFnZTogCgoKIyMgQXVmZ2FiZSAoMiBQdW5rdGUpOiBFcnN0ZWxsZSBlaW5lbiBiZXJlaW5pZ3RlbiBEYXRlbnNhdHoKCkJlcmVpbmlnZSBkYXMgRGF0YSBGcmFtZSwgaW5kZW0gZHUgQmVvYmFjaHR1bmdlbiBtaXQgQXVmZsOkbGxpZ2tlaXRlbiB1bmQgdW5wbGF1c2libGVuIFdlcnRlbiBpbiBkZW4gQXR0cmlidXRlbiAiQXZlcmFnZURhaWx5UmF0ZSIgdW5kICJIb3VzZWhvbGRUeXBlIiBlbnRmZXJuc3QuCgombmJzcDsKCioqRsOcUiBBTExFIFdFSVRFUkVOIEFOQUxZU0VOIElTVCBBVVNTQ0hMSUVTU0xJQ0ggREVSIEJFUkVJTklHVEUgREFURU5TQVRaIFpVIFZFUldFTkRFTiEhISoqCgpgYGB7cn0KCmBgYAoKCiMgVmlzdWFsaXNpZXJ1bmcKCioqRsOcUiBBTExFIFdFSVRFUkVOIEFOQUxZU0VOIElTVCBBVVNTQ0hMSUVTU0xJQ0ggREVSIEJFUkVJTklHVEUgREFURU5TQVRaIFpVIFZFUldFTkRFTiEhISoqCgoKIyMgQXVmZ2FiZSAoNSBQdW5rdGUpOiBBbmFseXNpZXJlIFp1c2FtbWVuaMOkbmdlIGthdGVnb3JpYWxlciBHcsO2c3NlbgoKRXJzdGVsbGUgZWluZSBncmFwaGlzY2hlIEFuYWx5c2UsIHdlbGNoZSBkaWUgcmVsYXRpdmVuIFVudGVyc2NoaWVkZSBkZXMgQXVmdHJldGVucyB2b24gU3BlemlhbHfDvG5zY2hlbiAocy4gIlRvdGFsU3BlY2lhbFJlcXVlc3RzIikgYmVpIEhvdGVscmVzZXJ2YXRpb25lbiBuYWNoIEhhdXNoYWx0c3R5cCAocy4gIkhvdXNlaG9sZFR5cGUiKSB1bnRlcnN1Y2h0IHVuZCB6dXPDpHR6bGljaCBiZXRyYWNodGV0LCBvYiBkaWUgQnVjaHVuZyBzdG9ybmllcnQgd3VyZGUgb2RlciBuaWNodCAocy4gIkJvb2tpbmdDYW5jZWxsZWQiKS4KCkhpbndlaXM6IFZlcndlbmRlIGbDvHIgZGVpbmUgSW1wbGVtZW50aWVydW5nIGRpZSBGdW5rdGlvbiBgZmFjZXRfd3JhcCgsIGxhYmVsbGVyID0gLi4uKWAuIAoKYGBge3J9CgpgYGAKCgojIyBBdWZnYWJlICg1IFB1bmt0ZSk6IEVyc3RlbGxlIGVpbmUgdmlzdWVsbGUgSMOkdWZpZ2tlaXRzdGFiZWxsZSAKCkVyc3RlbGxlIGVpbmUgSGVhdG1hcCwgd2VsY2hlIGRhcyBWb3Jrb21tZW4gdm9uIEFydCBkZXMgQXVmZW50aGFsdHMgdW5kIEhhdXNoYWx0c3R5cCBmYXJibGljaCB1bmQgaW4gWmFobGVuIGRhcnN0ZWxsdC4KCkhpbndlaXM6IFZlcndlbmRlIGbDvHIgZGVpbmUgSW1wbGVtZW50aWVydW5nIGRpZSBGdW5rdGlvbiBgZ2VvbV90aWxlKClgIHVuZCBlaW5lIEZhcmJza2FsYSwgd2VsY2hlIGdyb3NzZSBIw6R1Zmlna2VpdGVuIGR1bmtsZXIgZWluZsOkcmJ0IGFscyBrbGVpbmUuCgpgYGB7cn0KCmBgYAoKCiMjIEF1ZmdhYmUgKDUgUHVua3RlKTogRXJzdGVsbGUgZWluZW4gTW9zYWljLVBsb3RzIAoKRXJzdGVsbGUgYW5hbG9nIHp1ciBIZWF0bWFwIG9iZW4gZWluZW4gTW9zYWljcGxvdCwgd2VsY2hlciBkYXMgVm9ya29tbWVuIHZvbiBBcnQgZGVzIEF1ZmVudGhhbHRzIHVuZCBIYXVzaGFsdHN0eXAgZGFyc3RlbGx0IChGYXJiZW4ga8O2bm5lbiBmcmVpIGdld8OkaGx0IHdlcmRlbiwgWmFobGVuIHNpbmQgbmljaHQgaW0gUGxvdCB6dSBpbnRlZ3JpZXJlbikuCgpIaW53ZWlzOiBWZXJ3ZW5kZSBmw7xyIGRlaW5lIEltcGxlbWVudGllcnVuZyBkaWUgRnVua3Rpb24gYGdlb21fbW9zYWljKClgIGF1cyBkZW0gUGFrZXQgYGdnbW9zYWljYC4KCmBgYHtyfQoKYGBgCgoKIyMgQXVmZ2FiZSAoMTAgUHVua3RlKTogQW5hbHlzaWVyZSBkaWUgRGVmaW5pdGlvbiBkZXMgVGFnZXNkdXJjaHNjaG5pdHRwcmVpc2VzIAoKUGxhdXNpYmlsaXNpZXJlIHZpc3VlbGwsIGRhc3MgZGllIEFuZ2FiZW4gZGVzIEF0dHJpYnV0cyBUYWdlc2R1cmNoc2Nobml0dHByZWlzICgiQXZlcmFnZURhaWx5UmF0ZSIpIHNpY2ggbmljaHQgYXVmIGRlbiBQcmVpcyBwcm8gw5xiZXJuYWNodHVuZyB1bmQgUGVyc29uLCBzb25kZXJuIGF1ZiBkZW4gUHJlaXMgcHJvIMOcYmVybmFjaHR1bmcgcHJvIFppbW1lciBiZXppZWhlbi4KCkhpbndlaXM6IERpZSBWaXN1YWxpc2llcnVuZyBpc3Qga2VpbiBhYnNjaGxpZXNzZW5kZXIgQmV3ZWlzLiBCZXNjaHJlaWJlIGtsYXIgdW5kIG5hY2h2b2xsemllaGJhciwgd2llc28gZGllIHZvbiBkaXIgZ2V6ZWlndGUgR3JhZmlrIGVpbiBJbmRpeiBkYWbDvHIgaXN0LCBkYXNzIHNpY2ggZGllIGdlbGlzdGV0ZW4gVGFnZXNkdXJjaHNjaG5pdHRwcmVpc2UgYXVmIMOcYmVybmFjaHR1bmdlbiBwcm8gWmltbWVyIGJlemllaGVuLgoKYGBge3J9CgpgYGAKCgojIyBBdWZnYWJlICgxMCBQdW5rdGUpOiBQbGF1c2liaWxpc2llcmUgSW50ZXJwcmV0YXRpb24gZGVzIFRhZ2VzZHVyY2hzY2huaXR0cHJlaXNlcwoKSWRlbnRpZml6aWVyZSBkcmVpIEbDpGxsZSwgd2VsY2hlIGlsbHVzdHJpZXJlbiwgZGFzcyBkaWUgQW5nYWJlbiBkZXMgQXR0cmlidXRzIFRhZ2VzZHVyY2hzY2huaXR0cHJlaXMgKCJBdmVyYWdlRGFpbHlSYXRlIikgc2ljaCBhdWYgZGVuIFByZWlzIHBybyDDnGJlcm5hY2h0dW5nIHBybyBaaW1tZXIgYmV6aWVoZW4sIGluZGVtIGR1IGdlemllbHQgcGFhcndlaXNlIEJ1Y2h1bmdlbiB2ZXJnbGVpY2hzdCwgd28gc2ljaCBBbnphaGwgUGVyc29uZW4gdW5kIFRhZ2VzZHVyY2hzY2huaXR0cHJlaXMgdW50ZXJzY2hlaWRlbiwgYW5kZXJlIHJlbGV2YW50ZSBWYXJpYWJsZW4gYWJlciDDvGJlcmVpbnN0aW1tZW4uCgpHaWIgZsO8ciBkaWVzZSBkcmVpIEbDpGxsZSBmb2xnZW5kZSBBdHRyaWJ1dGUgYXVzOiAiR3JvdXBTaXplLngiLCAiR3JvdXBTaXplLnkiLCAiQXZlcmFnZURhaWx5UmF0ZS54IiwgIkF2ZXJhZ2VEYWlseVJhdGUueSIgKGRpZSBFbmR1bmcgIi54IiBiZXppZWh0IHNpY2ggYXVmIGRhcyBBdHRyaWJ1dCBkZXIgZXJzdGVuLCAiLnkiIGRlciB6d2VpdGVuIEJlb2JhY2h0dW5nIGRlciBwYWFyd2Vpc2VuIEJ1Y2h1bmcpLgoKSGlud2VpczogRXhwbG9yaWVyZSBCZWlzcGllbGUgdm9uIEhhbmQgdW5kIG1hY2hlIGRhbm4gZWluIFJlZmFjdG9yaW5nIGRlaW5lcyBDb2RlcywgZC5oLiB2ZXJ3ZW5kZSBmw7xyIGRlaW5lIEltcGxlbWVudGllcnVuZyBlaW5lIGVpZ2VuZSBGdW5rdGlvbiBtaXQgYHt7fX1gLCBzbyBkYXNzIGVpbmUgd8OkaGxiYXJlIE1lbmdlIHp1ZsOkbGxpZ2VyIEJlaXNwaWVsZSBzZWxla3RpZXJ0IHdlcmRlbiBrYW5uLgoKYGBge3J9CgpgYGAKCgojIyBBdWZnYWJlICg1IFB1bmt0ZSk6IEVyc3RlbGxlIEZhY2V0LVBsb3QgZGVzIFRhZ2VzZHVyY2hzY2huaXR0cHJlaXNlcwoKUmVwcm9kdXppZXJlIGRpZSBmb2xnZW5kZSBHcmFmaWsgKCJGaWd1cmUgMTogQXZlcmFnZURhaWx5UmF0ZV8yMDE2X1Jvb21BIikgZsO8ciBkaWUgVmVydGVpbHVuZyBkZXIgbW9uYXRsaWNoZW4gVGFnZXNkdXJjaHNjaG5pdHRwcmVpc2UgKCJBdmVyYWdlRGFpbHlSYXRlIikgdm9uIFppbW1lcm4gbWl0IEFzc2lnbmVkUm9vbVR5cGUgIkEiIGbDvHIgZGFzIEphaHIgMjAxNiBtaXQgYWxsZW4gZ2V6ZWlndGVuIERldGFpbHMuCgohW0F2ZXJhZ2VEYWlseVJhdGVfMjAxNl9Sb29tQV0oLi9BdmVyYWdlRGFpbHlSYXRlXzIwMTZfUm9vbUEucG5nKQoKYGBge3J9CgpgYGAKCgojIyBBdWZnYWJlICg1IFB1bmt0ZSk6IFZlcmJlc3NlcmUgRmFjZXQtUGxvdCBkZXMgVGFnZXNkdXJjaHNjaG5pdHRwcmVpc2VzCgpWZXJiZXNzZXJlIGRpZSB2b3JhbmdlaGVuZGUgR3JhZmlrIHNvLCBkYXNzIGRpZSBSZWloZW5mb2xnZSBkZXIgTW9uYXRlIGNocm9ub2xvZ2lzY2ggZ2VvcmRuZXQgaXN0LgoKYGBge3J9CgpgYGAKCgojIyBBdWZnYWJlICg1IFB1bmt0ZSk6IFJlcHJvZHV6aWVyZSBGYWNldC1QbG90IGRlcyBUYWdlc2R1cmNoc2Nobml0dHByZWlzZXMKClJlcHJvZHV6aWVyZSBkaWUgZm9sZ2VuZGUgR3JhZmlrICgiRmlndXJlIDI6IEF2ZXJhZ2VEYWlseVJhdGVfUm9vbXNBQ0RFRkcucG5nIikgbWl0IGFsbGVuIGdlemVpZ3RlbiBEZXRhaWxzIGbDvHIgZGllIFZlcnRlaWx1bmcgZGVyIFRhZ2VzZHVyY2hzY2huaXR0cHJlaXNlICgiQXZlcmFnZURhaWx5UmF0ZSIpIHZvbiBaaW1tZXJuIG1pdCBBc3NpZ25lZFJvb21UeXBlICJBIiwgIkMiLCAiRCIsICJFIiwgIkYiIHVuZCAiRyIgb2huZSBCZXNjaHLDpG5rdW5nIGRlcyBaZWl0cmF1bWVzLiAKCgohW0F2ZXJhZ2VEYWlseVJhdGVfUm9vbXNBQ0RFRkcucG5nXSguL0F2ZXJhZ2VEYWlseVJhdGVfUm9vbXNBQ0RFRkcucG5nKQoKYGBge3J9CgpgYGAKCgojIyBBdWZnYWJlICg1IFB1bmt0ZSk6IFZlcmVpbmZhY2hlIEZhY2V0LVBsb3QgZGVzIFRhZ2VzZHVyY2hzY2huaXR0cHJlaXNlcwoKRXJ6ZXVnZSBmw7xyIGRpZSBvYmVuIGRhcmdlc3RlbGx0ZW4gRGF0ZW4gbnVuIEJveHBsb3RzIHp1bSBWZXJnbGVpY2ggdm9uIFRhZ2VzZHVyY2hzY2huaXR0cHJlaXNlbiAoIkF2ZXJhZ2VEYWlseVJhdGUiKSBuYWNoIFppbW1lcnR5cCAoIkFzc2lnbmVkUm9vbVR5cGUiKSB1bmQgdmlzdWFsaXNpZXJlIGRpZSBHcnVwcGVuZ3LDtnNzZSBtaXQgSGlsZmUgZGVyIEZsw6RjaGUgZGVyIEJveC4KCmBgYHtyfQoKYGBgCgoKIyMgQXVmZ2FiZSAoNSBQdW5rdGUpOiBVbnRlcnN1Y2hlIHVuZCB2aXN1YWxpc2llcmUgS29ycmVsYXRpb25lbgoKQmVyZWNobmUgZGllIEtvcnJlbGF0aW9uIG5hY2ggQnJhdmFpcy1QZWFyc29uIGbDvHIgZGllIEF0dHJpYnV0ZSBQcmVpcyAoQXR0cmlidXQgIlByaWNlIikgdW5kIEFuemFobCDDnGJlcm5hY2h0dW5nZW4gKEF0dHJpYnV0ICJUb3RhbE5pZ2h0cyIpLiBFcnN0ZWxsZSB3ZWl0ZXIgZWluIFN0cmV1ZGlhZ3JhbW0gZsO8ciAiUHJpY2UiIHZzICJUb3RhbE5pZ2h0cyIgdW5kIGludGVncmllcmUgaW0gVW50ZXJ0aXRlbCBkaWUgSW5mb3JtYXRpb24gZGVyIEFuemFobCBCZW9iYWNodHVuZ2VuIHVuZCBkZXIgYmVyZWNobmV0ZW4gS29ycmVsYXRpb24gYXVmIGRyZWkgTmFjaGtvbW1hc3RlbGxlbiBnZXJ1bmRldC4KCkhpbndlaXM6IFZlcndlbmRlIGbDvHIgZGVpbmUgSW1wbGVtZW50aWVydW5nIGRpZSBGdW5rdGlvbiBgZ2VvbV9qaXR0ZXIoKWAgbWl0IHNpbm52b2xsZXIgV2FobCBkZXIgUGFyYW1ldGVyIGBhbHBoYWAgdW5kIGBzaGFwZWAuCgpgYGB7cn0KCmBgYAoKCiMjIEF1ZmdhYmUgKDEwIFB1bmt0ZSk6IEJlcmVpbmlndW5nIHZvbiBBdXNyZWlzc2VybgoKRXJzdGVsbGUgZGFzIG9iaWdlIFN0cmV1ZGlhZ3JhbW0gZsO8ciAiUHJpY2UiIHZzICJUb3RhbE5pZ2h0cyIgZXJuZXV0IHVuZCBzY2hyw6Rua2UgZGllIHgtQWNoc2UgdW5kIHktQWNoc2Ugc28gZWluLCBkYXNzIEF1c3NyZWlzc2VyIGFtIG9iZXJlbiBFbmRlIGRlciBTa2FsYSBuaWNodCBnZXplaWd0IHdlcmRlbi4gUGFzc2UgZGVuIFVudGVydGl0ZWwgYW4sIGluZGVtIGR1IGVyd8OkaG5zdCB3aWV2aWVsZSBBdXNyZWlzc2VyIG5pY2h0IGdlemVpZ3Qgd2VyZGVuLgoKSGlud2VpczogVmVyd2VuZGUgZsO8ciBkZWluZSBJbXBsZW1lbnRpZXJ1bmcgZGllIERlZmluaXRpb24gZGVzIEJveHBsb3RzOiBBdXNyZWnDn2VyIHNpbmQgRGF0ZW5wdW5rdGUsIGRpZSBzaWNoIGF1c3NlcmhhbGIgZGVyIFrDpHVuZSAoIldoaXNrZXJzIikgZGVzIEJveHBsb3RzIGJlZmluZGVuLiBEaWUgV2hpc2tlcnMgaGFiZW4gZGllIEzDpG5nZSBkZXMgMSw1LWZhY2hlbiBkZXMgSW50ZXJxdWFydGlsc2JlcmVpY2hzIHVuZCBzZXR6ZW4gb2JlcmhhbGIgZGVzIG9iZXJlbiBRdWFydGlscyB1bmQgdW50ZXJoYWxiIGRlcyB1bnRlcmVuIFF1YXJ0aWxzIGFuLgoKYGBge3J9CgpgYGAKCgojIyBBdWZnYWJlICgxMCBQdW5rdGUpOiBVbnRlcnN1Y2hlIGRlbiBaZWl0dmVybGF1ZiBkZXIgSG90ZWxhbmvDvG5mdGUKClZpc3VhbGlzaWVyZSBkaWUgQW56YWhsIGRlciBIb3RlbGJ1Y2h1bmdlbiBuYWNoIEFua3VuZnRzZGF0dW0gaW0gWmVpdHZlcmxhdWYsIHdvYmVpIGRpZSBzdG9ybmllcnRlbiBCdWNodW5nZW4gbmljaHQgenUgYmVyw7xja3NpY2h0aWdlbiBzaW5kLiBWaXN1YWxpc2llcmUgZGVuIFZlcmxhdWYgw7xiZXIgMTgwIFRhZ2UsIGJlZ2lubmVuZCBhbSAxLiBKdW5pIDIwMTYuCgpIaW53ZWlzOiBWZXJ3ZW5kZSBmw7xyIGRlaW5lIEltcGxlbWVudGllcnVuZyBgdGlkeXZlcnNlYCB1bmQgYGx1YnJpZGF0ZWAuCgpgYGB7cn0KCmBgYAoKCiMjIEF1ZmdhYmUgKDUgUHVua3RlKTogSWRlbnRpZml6aWVyZSBUYWdlIG1pdCBtZWlzdGVuIEJ1Y2h1bmdlbgoKSWRlbnRpZml6aWVyZSBkaWUgZsO8bmYgVGFnZSBtaXQgZGVuIG1laXN0ZW4gWmltbWVyLUJ1Y2h1bmdlbiBnZW1lc3NlbiBhbSBEYXR1bSBkZXIgQW5rdW5mdCwgd29iZWkgZGllIHN0b3JuaWVydGVuIEJ1Y2h1bmdlbiBuaWNodCB6dSBiZXLDvGNrc2ljaHRpZ2VuIHNpbmQuIEdpYiB6dXPDpHR6bGljaCBkaWUgQW56YWhsIFBlcnNvbmVuIGFuLCB3ZWxjaGUgYW4gZGllc2VuIFRhZ2VuIGVpbmdlY2hlY2t0IGhhYmVuLgoKYGBge3J9CgpgYGAKCgojIyBBdWZnYWJlICgxMCBQdW5rdGUpOiBVbnRlcnN1Y2hlIGRlbiBaZWl0dmVybGF1ZiBkZXMgbWl0dGxlcmVuIFRhZ2VzZHVyY2hzY2huaXR0c3ByZWlzZSBkZXIgQnVjaHVuZ2VuCgpCZXJlY2huZSBmw7xyIDIwMTYgZGllIHplaXRsaWNoZSBFbnR3aWNrbHVuZyBkZXMgVGFnZXNkdXJjaHNjaG5pdHRzcHJlaXNlcyAoIkF2ZXJhZ2VEYWlseVJhdGUiKSBhbGxlciBCdWNodW5nZW4gcHJvIFdvY2hlLiBWaXN1YWxpc2llcmUgZGVuIE1lZGlhbiBzb3dpZSBkYXMgMjUlLVBlcnplbnRpbCB1bmQgNzUlLVBlcnplbnRpbCwgdW0gZGllIFN0cmV1dW5nIGRlcyBUYWdlc2R1cmNoc2Nobml0dHNwcmVpc2VzIHp1IGlsbHVzdHJpZXJlbi4KCkJlc3RpbW1lIHVuZCBtYXJraWVyZSBkYW5uIHZpc3VlbGwgZGllIEthbGVuZGVyd29jaGUgbWl0IGRlbSBow7ZjaHN0ZW4gVGFnZXNkdXJjaHNjaG5pdHRzcHJlaXMgbWl0IEhpbGZlIGVpbmVyIHZlcnRpa2FsZW4gcm90ZW4gTGluaWUuIAoKYGBge3J9CgpgYGAKCgojIEVpZ2VuZSBBbmFseXNlbgoKIyMgQXVmZ2FiZSAoMjAgUHVua3RlKTogRXhwbG9yaWVyZSBkZW4gRGF0ZW5zYXR6IHdlaXRlciAKClVudGVyc3VjaGUgd2VpdGVyZSwgbm9jaCBuaWNodCBiZWxldWNodGV0ZSBadXNhbW1lbmjDpG5nZSBpbiBkZW4gRGF0ZW4gdW5kIGRva3VtZW50aWVyZSAoYSkgZGVpbmUgSHlwb3RoZXNlLCAoYikgZGllIGdlZnVuZGVuZW4gWnVzYW1tZW5ow6RuZ2VuIHByw6R6aXNlIGluIFdvcnRlbi4KCmBgYHtyfQoKYGBg